我正在开发一个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
,然后使用最初提交的相同模型返回相同的视图。
但是,当视图呈现时,此属性的复选框仍保持选中状态。我是否遗漏了一些阻止复选框取消选中的内容?
答案 0 :(得分:1)
ModelState
问题
简而言之,HtmlHelper显示的ModelState
值不是Model
。有关详细信息,请参阅问题。
可能的选择:
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});