我对ASP.NET MVC很陌生,而且我遇到的问题似乎应该是不费脑子的。
使用此ViewModel:
public enum Step
{
One = 1,
Two = 2,
Three = 3
}
public class TestViewModel
{
public string Description
{
get
{
return "Current step is " + this.Step;
}
}
public Step Step { get; set; }
public string Dummy{ get; set; }
public TestViewModel()
{ }
public TestViewModel(Step step)
{
this.Step = step;
}
}
和这个观点:
@using MvcApplication1
@model TestViewModel
@using (Html.BeginForm("Test", "Home"))
{
if (Model.Step == Step.One)
{
@Html.HiddenFor(m => m.Step)
@Html.HiddenFor(m => m.Dummy)
<p>@Model.Description</p>
}
else if (Model.Step == Step.Two)
{
@Html.HiddenFor(m => m.Step)
@Html.HiddenFor(m => m.Dummy)
<p>@Model.Description</p>
}
else if (Model.Step == Step.Three)
{
@Html.HiddenFor(m => m.Step)
@Html.HiddenFor(m => m.Dummy)
<p>@Model.Description</p>
}
<input type="submit" value="Continue" />
}
和这个控制器:
public ActionResult Test()
{
TestViewModel model = new TestViewModel(Step.One);
return View(model);
}
[HttpPost]
public ActionResult Test(TestViewModel model)
{
Debug.Print("Enter: Step = {0}", model.Step);
switch (model.Step)
{
case Step.One:
model.Step = Step.Two;
model.Dummy = "2";
break;
case Step.Two:
model.Step = Step.Three;
model.Dummy = "3";
break;
case Step.Three:
model.Step = Step.One;
model.Dummy = "1";
break;
}
Debug.Print("Enter: Step = {0}", model.Step);
return View(model);
}
在第一次按下按钮时,控制器将model.Step设置为Step.Two并且我的视图已正确更新。
但是在按钮model.Step的第二个(以及任何后续)点击中,它被读作Step.One而不是Step.Two,因此我的视图上没有更新任何内容。
我有什么明显的遗失吗?为什么没有正确读取/保存值?
答案 0 :(得分:2)
您的视图中不需要if else块。你基本上做同样的事情。这也有效:
@using (Html.BeginForm("Test", "Home"))
{
@Html.HiddenFor(m => m.Step)
<p>@Model.Description</p>
<input type="submit" value="Continue" />
}
发布表单后,您将在同一操作中返回一个视图。 ASP.NET MVC仅在HTML帮助程序中使用POST请求中的值,忽略操作中的更新值。在您提出第一个请求后,您可以在HTML中看到它,这里是the reason why it's implemented that way。
我建议实施Post-Redirect-Get pattern。更新值后,重定向到其他操作。
[HttpPost]
public ActionResult Test(TestViewModel model)
{
Debug.Print("Enter: Step = {0}", model.Step);
switch (model.Step)
{
case Step.One:
model.Step = Step.Two;
break;
case Step.Two:
model.Step = Step.Three;
break;
case Step.Three:
model.Step = Step.One;
break;
}
Debug.Print("Enter: Step = {0}", model.Step);
return RedirectToAction("SomeAction", model);
}
这会将模型序列化为查询字符串。更好的方法是将一些ID作为参数传递。