ASP.net MVC复选框问题

时间:2013-02-28 21:10:39

标签: asp.net asp.net-mvc asp.net-mvc-4 checkbox checkboxfor

我正在开发一个ASP.net MVC项目,我正在使用CheckBoxFor帮助器方法为我的模型中的boolean提供值,如下所示:

@Html.CheckBoxFor(m => m.ShouldSaveSearch, new { id="ShouldSaveSearch"})

如果该复选框被用户选中,则它完全正常并且当控制器收到模型时。 ShouldSaveSearch属性将设置为true。

[HttpGet]
public ActionResult Search(int studentSearchId = -1)
{
    return View(new StudentSearchModel(studentSearchId));
}

[HttpPost]
public ActionResult Search(StudentSearchModel m)
{
    ViewBag.SearchResults = Hub.Web.Models.Student.StudentSearchModel.Search(m);
    Hub.Web.Models.Student.StudentSearchModel.Save(m);
    m.ShouldSaveSearch = false;
    m.ShouldShareSearch = false;
    m.SavedSearchName = "";
    m.SavedSearchDescription = "";

    return View(m);
}

然后我将ShouldSaveSearch属性设置为false,然后使用最初提交的相同模型返回相同的视图。

但是,当视图呈现时,此属性的复选框仍保持选中状态。我是否遗漏了一些阻止复选框取消选中的内容?

3 个答案:

答案 0 :(得分:1)

这听起来像questionhere

中讨论的ModelState问题

简而言之,HtmlHelper显示的ModelState值不是Model。有关详细信息,请参阅问题。

可能的选择:

  • 按照Forty-Two
  • 的建议实施post-redirect-get模式
  • 使用ModelState集合重置复选框值,例如ModelState["ShouldSaveSearch"].Value = false

答案 1 :(得分:1)

您似乎想要取消选中默认复选框。那是链接到lambda的true / false值但是checked属性的值

@Html.CheckBoxFor(m => m.ShouldSaveSearch, new { @checked="false"})

其他要点同样重要。清除ModelState!

答案 2 :(得分:1)

这里的问题是,如果您返回与模型数据一起发布的相同视图,MVC会认为您因错误而返回。这是正常行为。如果要重新显示视图,则应实现PRG模式(Post-Redirect-Get)。无论ModelState.IsValid是真还是假,您的问题都将始终存在。您应该重定向到视图的HttpGet版本,传递参数并加载数据。如果您想避免加载,请将数据存储在TempData或其他一些Session实现中。

更新:您正在调用接收模型对象的操作的版本。一旦你坚持数据通话

return RedirectToAction("Search", new {studentSearchId = your_value});