C# 为什么Html.Checkbox(“可见”)返回“可见”;“对,错”;在ASP.NETMVC2中?

C# 为什么Html.Checkbox(“可见”)返回“可见”;“对,错”;在ASP.NETMVC2中?,c#,asp.net-mvc-2,checkbox,C#,Asp.net Mvc 2,Checkbox,我使用Html.Checkbox(“可见”)向用户显示复选框。在回发中,FormCollection[“可见”]值为“true,false”。为什么? 鉴于: <td> <%: Html.CheckBox("Visible") %> </td> 这是因为复选框帮助程序生成了一个与复选框同名的附加隐藏字段(您可以通过浏览生成的源代码来查看它): 我也有同样的问题。我用以下组合修复了它(在Darin Dimitrov的帮助

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

鉴于:

<td>                
    <%: Html.CheckBox("Visible") %>
</td>

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


我也有同样的问题。我用以下组合修复了它(在Darin Dimitrov的帮助下——谢谢):

视图:

以下是控件的源代码,包括实际选中的复选框和未选中的复选框(供参考):

检查:

<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将不会回发字段值,但如果复选框未选中,HTML将回发字段值。助手在checkbox控件(值为'False')之后追加一个隐藏字段。如果选中该复选框,则源显示“checked=‘checked’”。如果未选中,则不显示该复选框。因此,如果checked=checked,则将true传递回控制器。如果未选中该框,则不会传回控件,因此名为“相同”的隐藏字段将接管并传回false。这样你就有了两个条件。很奇怪,但它确实有效。我希望这会有所帮助。

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


如果人们被其他答案所困扰,那么这就是对我有效的方法-

如果你想/需要使用
FormCollection
,而不是检查
true
false
,检查
true、false
false

e、 而不是这个

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

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

我在MVC4中也遇到过同样的问题

这个解决方案对我有效

我的(表格)视图:

当复选框为true时,用于作废重复的“true,false”值

我将复选框param存储在一个数组中:

var arrParams = Request.Form["SomeBoolValue"].Split(',');
抓住第一个元素:

string sParam = arrParams[0].ToString();
解析它:

bool BoolValue = bool.Parse(sParam);
保留它:

MyObject.SomeBoolValue = BoolValue;

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;//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

浏览器有责任向请求发送或不发送复选框值?为什么?如果我在视图中直接使用
会怎么样?@Jalal Amini,如果你想避免这个隐藏字段,你确实可以在视图中直接使用
。+1了解Asp.Net MVC在引擎盖下发生的事情总是很有趣。嗨,Darin,请看看类似的场景并提供答案。谢谢。此解决方案出现错误:“无法将'bool'转换为'string'”应为:
adslService.Visible=collection[“Visible”]!=“假”我也这么做了。用支票盒消磨时间谢谢你这很有帮助。我同意,这些框架让简单的东西变得复杂。
adslService.Visible = bool.Parse(collection["Visible"] != "false");
@Html.EditorFor(m =>  m.SomeBoolValue)
var arrParams = Request.Form["SomeBoolValue"].Split(',');
string sParam = arrParams[0].ToString();
bool BoolValue = bool.Parse(sParam);
MyObject.SomeBoolValue = BoolValue;
            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