2011-05-09 126 views

回答

25

这是因为CheckBox助手生成具有相同名称的复选框额外的隐藏字段(您可以通过浏览生成的看到它源代码):

<input checked="checked" id="Visible" name="Visible" type="checkbox" value="true" /> 
<input name="Visible" type="hidden" value="false" /> 

所以两个值都是在您提交表单时发送给控制器操作。下面是解释这背后更多的隐藏字段的推理从ASP.NET MVC源代码直接评论:

if (inputType == InputType.CheckBox) { 
    // Render an additional <input type="hidden".../> 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) 
{ 
    ... 
} 
+0

浏览器有责任发送或不发送复选框值来请求?为什么? – Jalal 2011-05-09 11:40:34

+0

如果我直接在View中使用''怎么办? – Jalal 2011-05-09 11:41:28

+0

@Jalal Amini,如果你想避免使用这个隐藏字段,你可以直接在视图中使用''。 – 2011-05-09 12:12:48

1

我有同样的问题。我用下面的组合固定它(与达林季米特洛夫一点帮助 - 谢谢):

VIEW:

<label for="optIn"><%=Html.CheckBox("optIn", ViewData["OptIn"])%> 

控制器:

public ActionResult Index() 
{ 
    ViewData["Optin"] = True; 
} 

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

这是一个有控制源并且没有实际检查的复选框(供参考):

选中:

<input Length="4" checked="checked" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" /> 

未选中:

<input Length="4" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" /> 

所以,这里是我如何解释我的行为:如果该复选框未被选中,但会后回来,如果它是

HTML不会回发的字段值。该辅助程序在复选框控件(值为'False')后附加一个隐藏字段。如果复选框被选中,则源代码显示“checked ='选中'”,如果未选中,则不显示。所以,如果checked = checked,则true传回给控制器。如果该框未被选中,则控制权不会被传回,因此被命名为相同的隐藏字段接管并返回false。这样你有两个条件。奇怪,但它的作品。我希望这有帮助。

9

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

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

+1

之下发布了我的解决方案。我也这样做了。用复选框消磨时间 – Sakthivel 2013-06-17 07:06:47

+1

谢谢你的帮助。 – 2013-12-31 12:35:40

2

如果你想/需要使用FormCollection,不是检查truefalse,检查true,falsefalse

例如而不是这个

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

做到这一点

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

此解决方案提供了一个错误:“不能将'bool'转换为'字符串'” – 2013-02-27 10:16:38

+0

应该是: 'adslService.Visible = collection [“Visible”]!=“false”;' – 2014-01-30 02:05:16

2

我有同样的问题在MVC 4,

该解决方案为我工作。

我的(形式)查看:

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

对于排尿重复 “真,假” 值时,复选框是真的

我储存的复选框PARAM中的数组:

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

抓住第一个元素:

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

解析它:

bool BoolValue = bool.Parse(sParam); 

保持它:

MyObject.SomeBoolValue = BoolValue; 
0

的MVC Entension对Html.Checkbox的默认行为,生成一个隐藏字段与它一起被张贴。 在我的情况下,因为我添加到页面的自定义复选框不是像Html.CheckBoxFor那样绑定模型,所以我决定将它作为简单的html复选框。

<input type="checkbox" name="WithAttachment" checked="checked"/> Include Attachments

这听起来可能很傻,但将节省别人的时间比变通后运行。这将创建一个复选框使用MVC扩展

0

防止我已经有我到处使用来处理布尔类型的文本,并返回true或false静态函数作为一个布尔所以我只照顾它有

  if (sBool.StartsWith("true,")) bReturn = true;//cater for mvc checkboxes 

      else if (sBool == "true") bReturn = true; 

      else if (sBool == "t") bReturn = true;//t-f 

      else if (sBool == "1") bReturn = true;//1-0 

      else if (sBool == "yes") bReturn = true;//yes-no 

      else if (sBool == "y") bReturn = true;//y-n 

      else if (sBool == "on") bReturn = true;//on-off 
相关问题