【发布时间】:2014-10-28 20:05:03
【问题描述】:
Step1 的用户请求页面,填写并提交包含所选人员的表单,到目前为止一切顺利。在验证 ModelState 之后,下一个视图模型将使用所选人员正确构建。然后,我尝试使用 newVM 重定向到操作,但在进入 Step2 时发现 MVC 清除了试图传入的视图模型。我怀疑这是由于 MVC 如何根据查询字符串结果尝试新建和实例。我会在其中设置一个断点并检查它,但我想知道如何使用传入的新视图模型从帖子中更改视图?
public ActionResult Step1()
{
var vm = new VMStep1();
return View(vm);
}
[HttpPost]
public ActionResult Step1(VMStep1 vm)
{
if (ModelState.IsValid)
{
var newVM = new VMStep2(vm.SelectedPerson);
return RedirectToAction("Step2", newVM);
}
return View(vm);
}
public ActionResult Step2(VMStep2 vm)
{
return View(vm);
}
我可以通过在 Step1 视图中包含 VMStep2 和 Step2 的部分内容来解决此问题,但是当我真的只想让用户看到 Step2 时,这需要隐藏和查找逻辑。
【问题讨论】:
-
您需要将
newVM分配给会话(或将某些内容保存到数据库),然后在Step2方法中检索它(也可以使用TempData,但如果用户刷新它会失败浏览器) -
感谢 Stephen,这正是我所害怕的,但是我们必须遵守 MVC 规则。
-
不确定您所说的必须遵循 MVC 规则是什么意思?创建多步骤向导的两种方法是 1. 带有部分的单个表单,其中每个部分包含验证每个部分的下一个/后退按钮,然后使下一个部分可见并隐藏当前部分,最后一个部分包含提交按钮,或 2.as shown in this answer
-
MVC 规则是这样的:如果您使用强类型视图和接受这些类型作为参数的控制器,则默认情况下 MVC 会接管。它基于强类型视图强制输入和操作结果。目前没有办法使用一种视图模型进入控制器并返回另一种视图模型类型的结果。所以我为克服这个问题所做的就是在第一个视图模型中包含第二个视图模型,并简单地调用基于“其他”视图模型的局部视图。
-
这不是“规则”!如果
VMStep2仅包含原始属性,那么您的代码可以正常工作(RouteValueDictionary 是根据您的模型的属性生成的)。
标签: asp.net-mvc-4 viewmodel asp.net-mvc-viewmodel