MVC @ Html.CheckboxFor在表单提交时提交true,false

时间:2014-08-28 23:00:52

标签: asp.net-mvc

我正在使用MVC 5和EF Code First,并且有一个包含bool的View模型:

public bool MyCheckbox { get; set; }

我在我的视图中初始化了这个:

model.MyCheckbox = true;

在视图中:

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

将其呈现为:

<input checked="checked" data-val="true" data-val-required="The field is required." id="MyCheckbox" name="MyCheckbox" type="checkbox" value="true" />
<input name="MyCheckbox" type="hidden" value="false" />

View上的一个按钮触发了一个Ajax POST到Controller,我想查看复选框值:

bool bValue = Request["MyCheckbox"] == "true";

但是Request["MyCheckbox"]的值是&#34;是,假&#34;由于name="MyCheckbox"的额外隐藏字段。

如何使用Request [&#34; ...&#34;]查看控制器中此复选框的值并理解它(是真还是假)?

我在View模型中还有另一个bool成员,我故意在隐藏字段中使用它。在模型中:

bool MyHiddenBool { get; set; }

在Controller Get:

model.MyHiddenBool = true;

在视图中:

@Html.HiddenFor(x => x.MyHiddenBool)

在Controller中(通过Ajax POST):

bool AnotherBool = Request["MyHiddenBool"] == "true";

但是Request["MyHiddenBool"]的值是&#34; True&#34;或&#34;错误&#34;而不是&#34; true&#34;和&#34;假&#34;。

什么给出了这种不一致性,如何在我的视图中可靠地看到这两种bool方法的值?

1 个答案:

答案 0 :(得分:6)

问题是你如何使用表单请求变量。

在ASP.NET MVC中,使用Request.Form或它的变体可能永远不会有充分的理由来使用您的请求数据。你需要制作一个模型或为行动提出一个参数。

[HttpPost]
public ActionResult PostedForm(bool myHiddenBool)
{
  //Frameworks model binder will extract the form field into your variable based on the name
}

以下内容已从this answer.

复制
  

这不是一个bug,实际上与Ruby相同的方法   使用Rails和MonoRail。

     

当您提交带有复选框的表单时,仅在以下情况下发布该值   选中该复选框。所以,如果你不选中复选框,那么   在很多情况下你都不会将任何内容发送到服务器   希望错误发送。由于隐藏输入具有相同的名称   作为复选框,如果未选中该复选框,您仍然会得到一个   'false'发送到服务器。

     

选中此复选框后,ModelBinder将自动执行   关注从'true,false'中提取'true'