我是一个php头,并且掌握了ASP.NET MVC 5。 在php中,在提交复选框字段后,为了使用您最初设置为true的复选框回发表单,您必须在em上运行if isset。
然而,读取mvc中的模型绑定,似乎这是自动完成的,即在选中表单提交后,如果最初选中,则使用HTML.CheckBox或HTML.CheckBoxFor帮助程序返回复选框。
是这种情况,还是我期待过多的MVC?
答案 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.CheckBox
和HTML.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
}
}