ASP.net MVC 复选框问题

4

我正在开发一个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,并返回与最初提交的相同的模型和视图。

但是,当视图渲染时,此属性的复选框仍保持选中状态。 我是否遗漏了什么导致复选框不能自动取消勾选?


1
看起来你正在重置表单,然后重新显示视图。更好的做法(后重定向-获取模式)是使用RedirectToAction("Search")<--针对视图的GET请求进行重定向,而不是POST请求。 - Forty-Two
1
您不需要id =“ShouldSaveSearch” - 这将由mvc自动生成。 其次,[HttpPost]属性在哪里? - codingbiz
3个回答

2

你似乎想将复选框默认为未选中状态。这与lambda的真/假值无关,而与checked属性的值有关。

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

其他方面同样重要。清除模型状态!

1

这似乎是在讨论 这个问题这里 中提到的 ModelState 的问题。

简要概述一下,HtmlHelper 显示的是 ModelState 的值,而不是 Model 的值。更多细节请参阅问题。

可能的选项:

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

这确实是我的问题,但清除ModelState会删除其中我不想删除的其他值,而尝试ModelState["ShouldSaveSearch"].Value = false的解决方案会返回错误“无法隐式将类型'bool'转换为'System.Web.Mvc.ValueProviderResult'”。 - bjonnn
我能够通过 ModelState["ShouldSaveSearch"].Value = new ValueProviderResult("", "", CultureInfo.CurrentCulture); 移除一个值。 - bjonnn
作为进一步的更新,我能够通过说m.ShouldSaveSearch = false;然后ModelState.Remove("ShouldSaveSearch");来简化它。 - bjonnn

1
问题在于,如果您返回与模型数据一起发布的相同视图,则MVC会认为您是因为出现错误而返回。这是正常行为。如果要重新显示视图,则应实现PRG模式(Post-Redirect-Get)。无论ModelState.IsValid是true还是false,您的问题都将始终存在。您应重定向到视图的HttpGet版本,传递参数并加载数据。如果要避免加载,请将数据存储在TempData或其他Session实现中。
更新:您正在调用接收模型对象的操作版本。一旦持久化数据,请调用
return RedirectToAction("Search", new {studentSearchId = your_value});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接