为什么Html.Checkbox(“Visible”)在ASP.NET MVC 2中返回“true,false”?

我正在使用Html.Checkbox("Visible")向用户显示一个复选框。 在回发中, FormCollection["Visible"]值为“true,false”。 为什么?

在视图中:

    

在控制器中:

  adslService.Visible = bool.Parse(collection["Visible"]); 

那是因为CheckBox帮助器生成了一个与复选框同名的附加隐藏字段(您可以通过浏览生成的源代码来查看它):

   

因此,当您提交表单时,这两个值都将发送到控制器操作。 这是一个直接来自ASP.NET MVC源代码的注释,解释了这个额外隐藏字段背后的原因:

 if (inputType == InputType.CheckBox) { // Render an additional  for checkboxes. This // addresses scenarios where unchecked checkboxes are not sent in the request. // Sending a hidden input makes it possible to know that the checkbox was present // on the page when the request was submitted. ... 

我建议你使用视图模型作为动作参数或直接标量类型,而不是使用FormCollection ,并将解析的麻烦留给默认的模型绑定器:

 public ActionResult SomeAction(bool visible) { ... } 

我最近处理了这个问题,并提出了一种绕过MVC绑定并在查询字符串上使用Contains(“true”)的方法。 没有别的东西适合我。

如果人们坚持其他答案,那么这对我有用 – http://websitesorcery.com/post/2012/03/19/CheckBox-Issue-with-MVC-3-WebGrid-Paging-Sorting.aspx

如果您希望/需要使用FormCollection ,而不是检查truefalse ,请检查true,falsefalse

例如,而不是这个

 adslService.Visible = bool.Parse(collection["Visible"]); 

做这个

 adslService.Visible = bool.Parse(collection["Visible"] != "false"); 

我在MVC 4中遇到了同样的问题,

这个解决方案对我有用。

我的(表格)查看:

 @Html.EditorFor(m => m.SomeBoolValue) 

用于在CheckBox为true时排除重复的“true,false”值

我将CheckBox参数存储在一个数组中:

 var arrParams = Request.Form["SomeBoolValue"].Split(','); 

抓住第一个元素:

 string sParam = arrParams[0].ToString(); 

解析它:

 bool BoolValue = bool.Parse(sParam); 

收下:

 MyObject.SomeBoolValue = BoolValue; 

我遇到过同样的问题。 我使用以下组合修复它(在Darin Dimitrov的帮助下 – 谢谢):

视图:

  

控制器:

 public ActionResult Index() { ViewData["Optin"] = True; } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(FormCollection form, bool OptIn ) { ViewData["Optin"] = OptIn; } 

以下是实际选中和不选中复选框的控件的来源(供参考):

经过:

  

未选中:

  

所以,这就是我解释行为的方式:

如果取消选中该复选框,HTML将不会回发字段值,但如果是,则会回发。 帮助器在复选框控件之后附加隐藏字段(值为’False’)。 如果选中该复选框,则源显示“checked =’checked’”如果未选中,则不会显示。 因此,如果checked = checked,则将true传递回控制器。 如果未选中此框,则不会传回控件,因此名为相同的隐藏字段将接管并传回false。 这样你就有两个条件。 奇怪,但它的工作原理。 我希望这有帮助。

MVC Entension for Html.Checkbox的默认行为会生成一个隐藏字段以及要发布的字段。 在我的情况下,因为我添加到页面的自定义复选框不像Html.CheckBoxFor那样绑定模型,所以我决定将其设置为简单的html复选框。

  Include Attachments 

我已经有一个静态函数,我在任何地方使用它来处理布尔类型文本并返回true或false作为布尔值所以我只是在那里处理它

  if (sBool.StartsWith("true,")) bReturn = true;//cater for mvc checkboxes else if (sBool == "true") bReturn = true; else if (sBool == "t") bReturn = true;//tf else if (sBool == "1") bReturn = true;//1-0 else if (sBool == "yes") bReturn = true;//yes-no else if (sBool == "y") bReturn = true;//yn else if (sBool == "on") bReturn = true;//on-off