我有一个简单的MVC控制器和视图和模型(我删除了所有其他代码以找出问题) Model是一个简单的属性类:
public class SiteFileUploadModel
{
[Required]
public int ActivePage { get; set; }
}
查看也非常简单:
@model Models.SiteFileUploadModel
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@if (Model != null)
{
using (this.Html.BeginForm("Index", "SiteFileUpload"))
{
@Html.Hidden("ActivePage",Model.ActivePage)
@Model.ActivePage
switch (Model.ActivePage)
{
case 1:
<p>Page 1</p>
break;
case 2:
<p>Page 2</p>
break;
}
<button type="submit" name="actionButtons">Previous</button>
<button type="submit" name="actionButtons">Next</button>
}
}
控制器只有一种方法:
public class SiteFileUploadController : Controller
{
//
// GET: /FileUpload/SiteFileUpload/
[HttpGet]
public ActionResult Index()
{
var model = new SiteFileUploadModel();
model.ActivePage = 1;
return View(model);
}
[HttpPost]
public ActionResult Index(SiteFileUploadModel model, string actionButtons)
{
if (actionButtons == "Next")
{
model.ActivePage++;
}
if (actionButtons == "Previous")
{
model.ActivePage--;
}
return View(model);
}
}
当我运行它并按下一步时,我可以看到model.activePage变为2并且它也显示在输出上(它显示2和第2页),但隐藏值仍为1.实际上隐藏值是始终为1,它不遵循ActivePage的实际值。我还使用HiddenFor(m =&gt; m.ActivePage)生成隐藏字段并使用相同的效果测试它!问题是什么?
答案 0 :(得分:1)
请参阅此answer。
简而言之,您需要在重新显示视图之前清除ModelState,因为Html Helper将使用模型状态而不是模型来获取其数据。
将以下语句添加到控制器操作中:
ModelState.Clear();