【问题标题】:ASP.net MVC Checkbox IssueASP.net MVC 复选框问题
【发布时间】:2013-02-15 05:50:57
【问题描述】:

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

但是,当视图呈现时,此属性的复选框仍处于选中状态。是否有一些我遗漏的东西阻止复选框自行取消选中?

【问题讨论】:

  • 看起来您正在重置表单,然后重新显示视图。更好的做法(post-redirect-get 模式)是RedirectToAction("Search")
  • 您不需要 id = "ShouldSaveSearch" - 这将由 mvc 本身生成。二、[HttpPost]属性在哪里?

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


【解决方案1】:

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

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

对方的观点同样重要。清除 ModelState!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      这听起来像是questionhere 中讨论的ModelState 问题

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

      可能的选择:

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

      【讨论】:

      • 这确实是我的问题,但是,清除 ModelState 会从中删除我不想删除的其他值,并尝试 ModelState["ShouldSaveSearch"].Value = false 解决方案返回错误“无法隐式转换类型”布尔'到'System.Web.Mvc.ValueProviderResult'”。
      • 我可以通过ModelState["ShouldSaveSearch"].Value = new ValueProviderResult("", "", CultureInfo.CurrentCulture);删除一个值。
      • 作为进一步的更新,我可以通过说m.ShouldSaveSearch = false; 然后ModelState.Remove("ShouldSaveSearch"); 来简化它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2011-10-30
      • 2010-11-13
      • 1970-01-01
      • 2011-01-05
      • 2011-08-03
      相关资源
      最近更新 更多