为什么ASP.NET MVC Html.CheckBox输出两个具有相同名称的INPUT?

Fra*_*ger 30 asp.net-mvc

为什么世界上有这样的界限:

<%= Html.CheckBox("ForSale", Model.Product.ForSale)%> For Sale
Run Code Online (Sandbox Code Playgroud)

得到以下HTML:

<input id="ForSale" name="ForSale" type="checkbox" value="true" />
<input name="ForSale" type="hidden" value="false" />
For Sale
Run Code Online (Sandbox Code Playgroud)

现在每当我检查框和访问时Request.Form["ForSale"],我都会得到一个荒谬的回答"true,false".我应该解析那个吗?

对于其他HtmlHelper控件,此隐藏字段不会出现,那么为什么它会用于CheckBox?

如何关闭这个愚蠢的"功能"?或者HtmlHelper刚刚发展它的实用性?

更新

从下面的答案来看,似乎背后有一些逻辑.我准备了一个小扩展方法,所以我不必考虑它(感谢@ eu-ge-ne):

    public static bool GetCheckBoxValue(this System.Web.HttpRequestBase req, 
                                        string name) {
        return Convert.ToBoolean(req.Form.GetValues(name).First());
    }
Run Code Online (Sandbox Code Playgroud)

blo*_*art 38

如果未选中,则强制包含该字段.如果取消选中复选框,它将不会作为页面的一部分发送 - 只有在选中它们时才会发送它们,然后它们的值为true.如果取消选中复选框,隐藏字段将确保将发送false,因为始终会发送隐藏字段.

  • 你不应该解析字符串,也不要直接在你的动作中使用Request对象:只需使用布尔值作为你的一个动作方法参数,一切都将为你处理 (3认同)

Ste*_*ath 6

我采取了另一种方法:

不要使用Html.CheckBoxFor或Html.CheckBox帮助器方法来呈现复选框,而应使用普通的html呈现:

<input id="ShowOther" name="ShowOther" value="<%=Model.ShowOther %>" type="checkbox" <% if (Model.ShowOther)  { %>checked="checked"<% } %> />
Run Code Online (Sandbox Code Playgroud)

并且我添加了一个jQuery脚本,用于在选中/取消选中复选框时设置值。

<script type="text/javascript">
    $(function() {
        $('#ShowOther').click(function() {
            var checked = $(this).attr('checked');
            if (checked != undefined)
                $(this).val(true);
            else
                $(this).val(false);
        });
    });
</script>
Run Code Online (Sandbox Code Playgroud)

据我所能测试的那样,似乎总是将正确的发送到Controller,而不再有“ true,false”的问题