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>