【问题标题】:Does MVC remember checkbox values after submit?MVC 是否在提交后记住复选框值?
【发布时间】:2015-03-14 12:11:42
【问题描述】:

我是 php 负责人,正在掌握 ASP.NET MVC 5。 在 php 中,在提交复选框字段后,为了回发您选中的复选框最初设置为 true 的表单,您必须在 em 上运行 if isset。

然而,阅读 mvc 中的模型绑定,这似乎是为您自动完成的,即在表单提交检查后返回复选框,如果最初选择,则使用 HTML.CheckBox 或 HTML.CheckBoxFor 帮助器。

是这样吗,还是我对 MVC 期望过高?

【问题讨论】:

  • 我认为它是“自动”完成的,因为它读取提供的模型实例具有的任何数据(假设绑定成功)。你试过了吗?
  • 如果您绑定到模型属性 - @Html.CheckBoxFor(m => m.MyBooleanProperty)` - 并且您回传模型,那么 DefaultModelBinder 将为您正确绑定它。

标签: asp.net-mvc razor checkbox


【解决方案1】:

不,ASP.NET MVC 在提交后不会记住复选框值。作为一个 HTTP 应用程序,只要 ASP.NET MVC 呈现 HTML,它就会结束请求并忘记它刚刚完成的一切。然后在提交表单时,ASP.NET MVC 处理传入的 HTTP 请求并通过其模型绑定将其映射到您的模型(稍后将详细介绍它是如何做到的)。

我本人具有 PHP 背景,这是我在开始使用 ASP.NET MVC 时经常遇到的问题之一。

使用 ASP.NET MVC,您必须记住,您是在一个完整框架的上下文中工作的,并且为了确保您尽可能高效地工作,ASP.NET MVC 将处理很多平凡的事情为您工作 - ASP.NET MVC 的模型绑定就是一个完美的例子。

提交表单时,ASP.NET MVC 框架将解析所有传入的发布数据并尝试将其自动映射到您通过控制器操作提供的值。

因此,在 PHP 中,您通常会执行以下操作:

if(isset($_POST['checkboxValue'])) {
    $checkboxVal = $_POST['checkboxValue'];
}

ASP.NET MVC 会自动将传入的帖子数据绑定到您的操作参数,如下所示:

[HttpPost]
public ActionResult Submit(bool checkboxValue){
}

它通过检查参数名称(checkboxValue)与发布数据数组键的名称匹配,并且类型也匹配来做到这一点。例如,如果您要将上述 checkboxValue 从 boolean 更改为 string 并更改名称,则 ASP.NET MVC 的模型绑定将无法将属性与发布数据匹配,并且不会自动设置为您带来价值。

还值得注意的是,ASP.NET MVC 的模型绑定不知道您是如何创建复选框的。

HTML.CheckBoxHTML.CheckBoxFor html 帮助器纯粹是一种使您更容易创建 HTML 的方法。如果您自己手动编写 HTML,那么模型绑定器仍将成功绑定提交的数据。

编辑:

正如@DrinkBird 非常正确地指出的那样,您还可以通过使用FormCollection 实例来访问表单的所有帖子数据,如下所示:

[HttpPost]
public ActionResult Submit(FormCollection postData){
}

此集合表示发布到 Submit 操作的所有数据。

【讨论】:

  • 您还可以使用 FormCollection 参数,该参数包含回发到服务器的每个数据。
  • 非常真实!我已经修改了我的答案,因为我觉得应该包括在内。
【解决方案2】:

是的,模型绑定应该允许您在提交时检索复选框的值。

如果你的模型看起来像:

public class myModel
{
    public bool myBool {get; set;}
}

在您的 HTML 中,您使用了帮助程序

@Html.CheckBoxFor(m => m.myBool)

然后在你的 post action 中处理提交:

[HttpPost]
public ActionResult MyAction(myModel model)
{
    var whatsThis = model.myBool;
}

...whatsThis 如果选中复选框,则为 true,否则为 false。

部分原因是,当您使用@html.CheckBoxFor 时,它还会放置一个隐藏的表单字段,如果未选中该框,该字段将传递 false,以帮助模型绑定 - 如果没有,则根据 HTTP 那里不会在 post-vars 集合中提交 varibalbe 'myBool'。

如果您将此模型返回到表单中(例如,如果它没有验证),那么表单将在提交时以任何状态重新显示复选框:

[HttpPost]
public ActionResult MyAction(myModel model)
{
  if(!ModelState.IsValid)
  {
     return View(model);
  }
  else
  {
     //do success
  }
}

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2011-07-28
    • 2014-08-27
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多