视图未从mvc中的模型更新

时间:2012-05-23 09:41:53

标签: asp.net-mvc razor

我有一个简单的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)生成隐藏字段并使用相同的效果测试它!问题是什么?

1 个答案:

答案 0 :(得分:1)

请参阅此answer

简而言之,您需要在重新显示视图之前清除ModelState,因为Html Helper将使用模型状态而不是模型来获取其数据。

将以下语句添加到控制器操作中:

ModelState.Clear();