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

时间:2011-05-09 11:10:12

标签: c# asp.net-mvc-2 checkbox

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

在视图中:

<td>                
    <%: Html.CheckBox("Visible") %>
</td>
控制器中的

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

7 个答案:

答案 0 :(得分:28)

这是因为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)
{
    ...
}

答案 1 :(得分:9)

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

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

答案 2 :(得分:2)

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

e.g。而不是这个

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

这样做

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

答案 3 :(得分:2)

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

这个解决方案对我有用。

我的(表格)查看:

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

当CheckBox为真时,取消重复的“true,false”值

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

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

抓住第一个元素:

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

解析它:

bool BoolValue = bool.Parse(sParam);

保持:

MyObject.SomeBoolValue = BoolValue;

答案 4 :(得分:1)

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

查看:

<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 = checked,则将true传递回控制器。如果未选中此框,则不会传回控件,因此名为相同的隐藏字段将接管并传回false。这样你就有两个条件。奇怪,但它的工作原理。我希望这会有所帮助。

答案 5 :(得分:0)

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

&#13;
&#13;
<div class="col-md-8 blogger-right-container">
                <form action="blogger_account.php" method="post" role="form" enctype="multipart/form-data">
                    <div class="form-group">
                        <h2>Blog Title</h2>
                        <input type="text" class="form-control" name="blog_title" placeholder="Enter title for your blog.">
                    </div>
                    <div class="form-group">
                        <h2>Blog Content</h2>
                        <textarea name="blog_content" class="form-control" cols="30" rows="10" placeholder="Enter the content here."></textarea>
                    </div>
                    <div class="form-group" style="text-align: center;">
                        <input type="submit" class="btn btn-success btn-lg" name="add" value="Insert">
                    </div>
                </form>

            </div> <!-- blogger right container -->
&#13;
&#13;
&#13;

这可能听起来很愚蠢,但是比在工作之后跑步可以节省一些人的时间。这将阻止使用MVC扩展名创建复选框

答案 6 :(得分: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