为什么CheckBoxFor会呈现额外的输入标记,以及如何使用FormCollection获得值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (51)

在我的ASP.NETMVC应用程序中,我使用以下代码呈现一个复选框:

<%= Html.CheckBoxFor(i=>i.ReceiveRSVPNotifications) %>

现在,我看到双双复选框输入标记和隐藏输入标记。我遇到的问题是当我尝试使用FormCollection从复选框中检索值时:

FormValues["ReceiveRSVPNotifications"]

我得到了“真,假”的价值。当查看呈现的HTML时,我可以看到以下内容:

 <input id="ReceiveRSVPNotifications" name="ReceiveRSVPNotifications" value="true" type="checkbox">
 <input name="ReceiveRSVPNotifications" value="false" type="hidden">

因此,FormValue集合似乎加入了这两个值,因为它们的名称相同。

有什么想法吗?

提问于
用户回答回答于

这不是一个bug,实际上是RubyonRails和Monorail使用的相同方法。 当提交带有复选框的表单时,只有选中复选框时才会张贴该值。因此,如果不选中复选框,那么在许多情况下,如果希望false被发送,则不会将任何内容发送到服务器。由于隐藏输入与复选框具有相同的名称,因此如果未选中复选框,则仍将收到发送给服务器的“false”。 选中复选框时,ModelBinder将自动从“true,false”中提取“true”

用户回答回答于

这种方法对于POST来说可能很棒,但对GET来说。因此,我实现了一个简单的HTML扩展,该扩展只需要去掉隐藏的字段。

public static MvcHtmlString BasicCheckBoxFor<T>(this HtmlHelper<T> html, 
                                                Expression<Func<T, bool>> expression,
                                                object htmlAttributes = null)
{
    var result = html.CheckBoxFor(expression).ToString();
    const string pattern = @"<input name=""[^""]+"" type=""hidden"" value=""false"" />";
    var single = Regex.Replace(result, pattern, "");
    return MvcHtmlString.Create(single);
}

我现在面临的问题是,我不想改变MVC框架来破坏我的代码。所以我必须确保我有测试范围来解释这个新合同。

扫码关注云+社区