Razor ViewEngine HTML.Checkbox 方法创建一个隐藏的输入。为啥? [复制]

Posted

技术标签:

【中文标题】Razor ViewEngine HTML.Checkbox 方法创建一个隐藏的输入。为啥? [复制]【英文标题】: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元素?

【问题讨论】:

【参考方案1】:

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

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

ChxName=true&ChxName=false

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

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

ChxName=false

【讨论】:

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

ericvg 解释的很好。

手动方法是这样的:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于Razor ViewEngine HTML.Checkbox 方法创建一个隐藏的输入。为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

MVC ViewEngine视图引擎解读及autofac的IOC运用实践

列出 ASP.MVC 中的所有视图

定制属于你自己的ViewEngine(一套逻辑多套UI)

Express中使用Pug写模板引擎

在 Express 中使用模板引擎

关于 razor,.NET MVC 对 razor 的支持与 .NET razor pages 有啥区别,有啥叫做 .NET MVC razor pages 的东西吗?