我尝试使用多页表单,其中使用单个控制器操作,并根据模型上的值返回视图。
我的模型有一个属性,我使用Html.HiddenFor()在视图中输入字段。
以下是我的简化模型:
public class MyModel
{
public virtual int Step { get; set; }
}在我看来,我有:
@model MyModel
...
@Html.HiddenFor(model => model.Step)在我的控制器里我有:
public ActionResult Create()
{
...
myModel.Step = 1;
return View("View1", myModel);
}
[HttpPost]
public ActionResult Create(MyModel myModel)
{
...
if (myModel.Step == 1)
{
myModel.Step = 2;
return View("View2", myModel);
}
else if (myModel.Step == 2)
{
...
}
...
}我的问题是,我的控制器总是认为mymodel.Step的值是1。为什么呢?
奇怪的是,我试图在表单上显示以下内容:
@Html.DisplayFor(model => model.Step)
@Html.EditorFor(model => model.Step)第二次显示页面时,第一行显示文本"2“。第二个显示了一个"1“的输入字段。我很困惑。
附加信息:
我的模型还有一个Guid属性,它在隐藏字段中传递给View。我还试图在回发时更改它,并在第二次检查它的值。新的价值没有登记。模型返回第一篇文章之前的原始值。因此,它与另一个领域是一致的。
我可能不得不使用不同的控制器动作,如果我找不到为什么它现在的行为方式。
解决方案:
正如Reda在下面建议的那样,我通过在我的post动作方法中这样做来修正它:
下面是一个博客帖子,它确认需要清除此场景的ModelState。
发布于 2013-11-12 09:40:32
通常,当您从post操作返回到视图时,这意味着在验证过程中发生了一些失败,并且应该使用提交的值再次显示表单。这就是为什么当您返回视图时,ModelState会记住您的输入,并且您的输入将从ModelState中填充,而不是您的视图模型。
在我看来,你有两个解决方案:
ModelState.Clear,它将在设置新值之前删除旧值。第二个解决方案是更好的解决方案,因为您没有显示带有验证错误的旧表单,而只是显示一个具有不同值的新视图。
下面是一个例子(当然,您可以根据您的需要调整它):
public ActionResult Create(int? step)
{
...
myModel.Step = step.HasValue ? step.Value : 1; // or whatever logic you need to apply
return View("View1", myModel);
}
[HttpPost]
public ActionResult Create(MyModel myModel)
{
...
if (myModel.Step == 1)
{
return RedirectToAction("Create", new { step = 2 });
}
else if (myModel.Step == 2)
{
...
}
...
}https://stackoverflow.com/questions/19924904
复制相似问题