ASP.net MVC复选框问题
我正在从事一个ASP.net MVC项目,我正在使用ASP.net MVC复选框问题,asp.net,asp.net-mvc,asp.net-mvc-4,checkbox,checkboxfor,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Checkbox,Checkboxfor,我正在从事一个ASP.net MVC项目,我正在使用CheckBoxForhelper方法为我的模型中的boolean提供值,如下所示: @Html.CheckBoxFor(m => m.ShouldSaveSearch, new { id="ShouldSaveSearch"}) 如果用户选中该复选框,则当控制器收到模型时,该复选框将完全正常工作。ShouldSaveSearch属性将设置为true [HttpGet] public ActionResult Search(int st
CheckBoxFor
helper方法为我的模型中的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
,然后返回与最初提交的模型相同的视图
但是,当视图渲染时,此属性的复选框保持选中状态。是否有我遗漏的阻止复选框自身取消选中的内容?这听起来像是本文中讨论的
ModelState
问题,而且
简单地说,HtmlHelper显示的是ModelState
值而不是Model
。有关更多详细信息,请参阅问题
可能的选择:
- 实现四十二条建议的post-redirect-get模式
- 使用
集合重置复选框值,类似于ModelState
ModelState[“ShouldSaveSearch”]。value=false
@Html.CheckBoxFor(m => m.ShouldSaveSearch, new { @checked="false"})
其他人的观点同样重要。清除模型状态 这里的问题是,如果您返回与模型数据发布到的视图相同的视图,MVC会认为您是因为错误而返回的。这是正常的行为。如果您想重新显示视图,那么应该实现PRG模式(Post Redirect Get)。无论
ModelState.IsValid
是否为真,您的问题始终存在。您应该重定向到视图的HttpGet版本,传递参数并加载数据。如果要避免加载,请将数据存储在TempData
或其他一些会话实现中
更新:您正在调用接收模型对象的操作的版本。一旦您持久化数据调用
return RedirectToAction("Search", new {studentSearchId = your_value});
看起来您正在重置表单,然后重新显示视图。更好的实践(post-redirect-get模式)是
redirectotoaction(“Search”)
您不需要id=“ShouldSaveSearch”——这将由mvc本身生成。第二,[HttpPost]属性在哪里?这确实是我的问题,但是,清除ModelState会从中删除我不想删除的其他值,并且尝试ModelState[“ShouldSaveSearch”]。Value=false
解决方案会返回一个错误“无法将类型'bool'隐式转换为'System.Web.Mvc.ValueProviderResult'”。我可以通过ModelState[“ShouldSaveSearch”]删除一个值。value=new-ValueProviderResult(“,”,CultureInfo.CurrentCulture)
。作为进一步的更新,我可以通过说m.ShouldSaveSearch=false;
然后说ModelState.Remove(“ShouldSaveSearch”);