代码之家  ›  专栏  ›  技术社区  ›  Omu

ASP.NET MVC:为什么html.checkbox会生成附加的隐藏输入

  •  192
  • Omu  · 技术社区  · 15 年前

    我刚注意到 Html.CheckBox("foo") 生成2个输入而不是1个,谁知道为什么会这样?

    <input id="foo" name="foo" type="checkbox" value="true" />
    <input name="foo" type="hidden" value="false" /> 
    
    9 回复  |  直到 6 年前
        1
  •  179
  •   LukLed    15 年前

    如果未选中复选框,则不会提交表单域。这就是为什么隐藏字段中总是存在错误值的原因。如果不选中复选框,表单仍将具有隐藏字段中的值。这就是ASP.NET MVC处理复选框值的方式。

    如果要确认,请在表单上放置一个复选框,而不是使用html.hidden,而是使用 <input type="checkbox" name="MyTestCheckboxValue"></input> . 不选中复选框,提交表单并查看服务器端已发布的请求值。您将看到没有复选框值。如果您有隐藏字段,它将包含 MyTestCheckboxValue 输入 false 价值。

        2
  •  29
  •   Alexander Trofimov    8 年前

    您可以编写一个帮助器来防止添加隐藏的输入:

    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})
    
        3
  •  10
  •   Community CDub    8 年前

    选中并提交复选框后,执行此操作

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

    Refer

        4
  •  7
  •   Valamas ConsultUtah    14 年前

    手动方法如下:

    bool IsDefault = (Request.Form["IsDefault"] != "false");
    
        5
  •  5
  •   Ciro Corvino    8 年前

    这是Alexander Trofimov解决方案的强类型版本:

    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);
        }
    }
    
        6
  •  1
  •   Dave D    8 年前

    使用contains,它将使用两个可能的post值:“false”或“true,false”。

    bool isChecked = Request.Form["foo"].Contains("true");
    
        7
  •  0
  •   josliber Martin Ballet    10 年前

    这不是虫子!它增加了将表单发布到服务器后始终具有值的可能性。 如果要使用jquery处理复选框输入字段,请使用prop方法(将“checked”属性作为参数传递)。 例子: $('#id').prop('checked')

        8
  •  0
  •   Saïd Mezhoud    10 年前

    您可以尝试这样初始化模型的构造函数:

    public MemberFormModel() {
        foo = true;
    }
    

    在你看来:

    @html.Checkbox(...)
    @html.Hidden(...)
    
        9
  •  -1
  •   Matthew Lock fge    8 年前

    当我有一个网络网格时,我发现这确实引起了一些问题。webgrid上的排序链接将由加倍的querystring或x=true&x=false转换为x=true、false,并在的复选框中导致分析错误。

    我最终使用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>