【问题标题】:Razor ViewEngine HTML.Checkbox method creates a hidden input. Why? [duplicate]Razor ViewEngine HTML.Checkbox 方法创建一个隐藏的输入。为什么? [复制]
【发布时间】:2011-07-24 16:39:00
【问题描述】:

我在我的视图页面上写了下面的代码;

@Html.CheckBox("ChxName",true)

我得到了以下结果;

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

为什么会有一个和checkbox同名的input元素?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor checkbox


    【解决方案1】:

    未选中的复选框不会发布,因此隐藏字段(设置为 false)允许模型绑定仍然有效。

    查看回帖上的 Request.Form。如果选中该复选框,您将看到:

    ChxName=true&ChxName=false
    

    模型绑定器使用第一个值。

    如果未选中该框,您将看到:

    ChxName=false
    

    【讨论】:

    • 也就是说,这个复选框将作为假传递给控制器​​?
    • 仅当未选中该框时。如果它被选中,它将与 true 绑定。用调试器试一试。另外,在没有 HTML 帮助器的情况下尝试一下,你就会明白他们为什么这样做了。
    • 据我了解,如果选中复选框并且控制器在此之后获取隐藏字段的值,则隐藏字段值变为真。我在这儿跟着你对吗?
    • 不,隐藏值将总是为假,并且总是发布。如果选中该框,也会发布一个 true 并且模型绑定器使用该 true 值。这是一个常见的问题,所以如果你仍然不明白或者只是看一下 mvc 源代码,你可能想谷歌一下。
    • 没问题——这是另一个可以更好地解释它的 SO 答案:stackoverflow.com/questions/2697299/…
    【解决方案2】:

    ericvg 解释的很好。

    手动方法是这样的:

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

    【讨论】:

      【解决方案3】:

      或者使用我觉得更简洁的 Contains("true")...

      bool myCheckBoxValue = Server.HtmlEncode(Request.QueryString["MyCheckBoxValue"]).Contains("true");
      

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 2020-03-07
        • 1970-01-01
        • 2015-08-05
        相关资源
        最近更新 更多