asp.net mvc:为什么Html.CheckBox生成一个额外的隐藏input

我只注意到Html.CheckBox("foo")生成2个input而不是1个,有人知道这是为什么?

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

如果未选中checkbox,则不会提交表单字段。 这就是为什么隐藏领域总是存在虚假价值的原因。 如果您不选中checkbox,窗体将仍然具有来自隐藏字段的值。 这就是ASP.NET MVC如何处理checkbox值。

如果你想确认,在表单上放置一个不是Html.Hidden的checkbox,而是使用<input type="checkbox" name="MyTestCheckboxValue"></input> 。 离开checkbox,提交表单,并在服务器端查看张贴的请求值。 你会看到没有checkbox的值。 如果您有隐藏的字段,它将包含具有false值的MyTestCheckboxValue条目。

你可以写一个帮手来防止添加隐藏的input:

 using System.Web.Mvc; using System.Web.Mvc.Html; public static class HelperUI { public static MvcHtmlString CheckBoxSimple(this HtmlHelper htmlHelper, string name, object htmlAttributes) { string checkBoxWithHidden = htmlHelper.CheckBox(name, htmlAttributes).ToHtmlString().Trim(); string pureCheckBox = checkBoxWithHidden.Substring(0, checkBoxWithHidden.IndexOf("<input", 1)); return new MvcHtmlString(pureCheckBox); } } 

用它:

 @Html.CheckBoxSimple("foo", new {value = bar.Id}) 

当checkbox被选中并提交时执行此操作

 if ($('[name="foo"]:checked').length > 0) $('[name="foo"]:hidden').val(true); 

参考

手动方法是这样的:

 bool IsDefault = (Request.Form["IsDefault"] != "false"); 

这是Alexander Trofimov解决scheme的强types版本:

 using System.Web.Mvc; using System.Web.Mvc.Html; public static class HelperUI { public static MvcHtmlString CheckBoxSimpleFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlAttributes) { string checkBoxWithHidden = htmlHelper.CheckBoxFor(expression, htmlAttributes).ToHtmlString().Trim(); string pureCheckBox = checkBoxWithHidden.Substring(0, checkBoxWithHidden.IndexOf("<input", 1)); return new MvcHtmlString(pureCheckBox); } } 

这不是一个错误! 在将表单发布到服务器之后,它增加了始终具有价值的可能性。 如果你想用jQuery处理checkbox的input字段,使用prop方法(传递'checked'属性作为参数)。 例如: $('#id').prop('checked')

你可以尝试像这样初始化你的Model的构造函数:

 public MemberFormModel() { foo = true; } 

并在你看来:

 @html.Checkbox(...) @html.Hidden(...) 

使用Contains,它将使用两个可能的后置值:“false”或“true,false”。

 bool isChecked = Request.Form["foo"].Contains("true"); 

当我有一个WebGrid时,我发现这确实造成了问题。 WebGrid上的sorting链接会将查询string加倍或x = true&x = false转换为x = true,false,并在checkbox中导致parsing错误。

我结束了使用jQuery删除客户端的隐藏字段:

  <script type="text/javascript"> $(function () { // delete extra hidden fields created by checkboxes as the grid links mess this up by doubling the querystring parameters $("input[type='hidden'][name='x']").remove(); }); </script>