MVC在提交后是否记得复选框值?

时间:2015-01-15 23:05:39

标签: asp.net-mvc razor checkbox

我是一个php头,并且掌握了ASP.NET MVC 5。 在php中,在提交复选框字段后,为了使用您最初设置为true的复选框回发表单,您必须在em上运行if isset。

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

是这种情况,还是我期待过多的MVC?

2 个答案:

答案 0 :(得分:3)

不,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)是否匹配post数据数组键,并且该类型也匹配来完成此操作。例如,如果您要将上述checkboxValue从boolean更改为string并更改名称,那么ASP.NET MVC的模型绑定将无法将属性与发布数据,不会自动为您设置值。

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

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

修改

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

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

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

答案 1 :(得分:1)

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

如果您的模型如下:

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

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

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

然后在你的邮政行动中处理提交:

[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
  }
}