【发布时间】:2015-08-06 14:38:08
【问题描述】:
我是 MVC 新手,正在尝试创建一系列向导式的视图,将相同的模型实例从一个视图传递到下一个视图,用户在每个表单上完成更多信息。控制器看起来像这样:-
[HttpGet]
public ActionResult Step1()
{
return View();
}
[HttpPost]
public ActionResult Step1(MyModel model)
{
if (!ModelState.IsValid)
return View(model);
return View("Step2", model);
}
[HttpPost]
public ActionResult Step2(MyModel model)
{
if (!ModelState.IsValid)
return View(model);
return View("Step3", model);
}
// etc..
问题:-
当我从 Step1 视图提交表单时,它调用 Step1 POST 方法并导致 Step2 视图显示在浏览器中。当我在 this 视图上提交表单时,它再次调用 Step1 POST 方法!我通过在
Html.BeginForm()中指定动作和控制器名称来让它工作,所以我猜测无参数重载只是返回到呈现视图的动作?我注意到浏览器的地址栏与当前视图不同步 - 当我在 Step2 视图上时,它仍然显示 Step1 URL,而在 Step3 时它显示 Step2 URL。怎么回事?
我见过的另一种在视图之间传递模型的方法是将模型放入
TempData,然后使用RedirectToAction()。与我目前正在做的相比,这种方法的优缺点是什么?我不会在向导中提供任何我自己的“后退”按钮。关于浏览器的后退按钮,是否有任何需要注意的陷阱?以上两种方法中的任何一种是否有帮助(或阻碍)?
编辑
在@StephenMuecke 的评论的提示下,我现在已将其重写为使用单个视图。我之前尝试过一次,但在往返“步数”以跟踪我在向导中的位置时遇到了困难。我最初使用的是使用@Html.HiddenFor', but this wasn't updating as the underlying model property changed. This appears to be "by design", and the workaround is to create the hidden field using vanilla HTML ( 创建的隐藏字段
无论如何,单视图向导现在正在工作。唯一的问题是用户在完成向导后能够单击返回按钮、进行更改并重新提交第二次(导致第二条数据库记录)。
我尝试将[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")] 添加到我的 POST 方法中,但所做的只是显示(在我的情况下)一个 Chrome 错误页面,建议用户单击刷新以重新提交表单。这对用户不友好,也不会阻止第二次提交。
【问题讨论】:
-
您为什么不使用单个表单来显示/隐藏每个步骤?
-
@StephenMuecke 谢谢,看看我的编辑!
-
我的想法更像是this answer
标签: asp.net-mvc