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

我正在从事一个ASP.net MVC项目,我正在使用
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

您似乎希望将复选框默认为未选中。即未链接到lambda的真/假值,而是链接到checked属性的值

@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”);