如何模仿MVC的复选框 - > bool模型绑定?

时间:2011-11-08 03:58:02

标签: asp.net-mvc asp.net-mvc-3 checkbox model-binding

我有一个编辑器模板,它会显示一个复选框:

@Html.CheckBoxFor(model => model.Follow)

其中包含以下内容:

<input checked="checked" data-val="true" data-val-required="The Follow field is required." id="Follow" name="Follow" type="checkbox" value="true" />
<input name="Follow" type="hidden" value="false" />

AFAIK隐藏字段与未经检查的盒子未发送到服务器或其他东西时的餐饮有关。

无论如何,如果我在选中复选框时查看Request.Form["Follow"],我会看到值为“true,false”。

如何从此值强制bool?我只是忽略了第二个字段吗? (例如隐藏的领域)。

我这样做是一个基本控制器(受保护的方法,从子控制器调用),因此我没有强类型视图模型,只有原始Request对象。

有人可以帮忙吗?或者,如果有人能指出我在MVC源代码中发生这种情况的地方,我可以自己看看,但不知道从哪里开始寻找。

3 个答案:

答案 0 :(得分:2)

您是正确的隐藏字段只是将表单提交给服务器。因为如果表单只有未选中的复选框,则不会提交任何内容,服务器也不会知道将它们设置为false。

  1. 每个表单只需要1个隐藏字段,每个复选框不需要一个。但是如果您自己控制,很难判断隐藏的文本框是否已经在场上。如果您知道在表单上的其他地方总是会有文本框或选择列表等,则根本不需要隐藏的文本框

  2. 您可以将隐藏的文本框重命名为任何名称为“dummy”的名称或与复选框名称不同的名称,以便Request.Form [“Follow”];只返回不需要拆分的复选框的值。您永远不需要检查“隐藏文本框”的值。

  3. 在旁注上你不应该使用Request.Form [“Follow”]你的Action方法应该有这样的参数而不是“bool?follow”

答案 1 :(得分:2)

MVC帮助器使用两个输入字段(复选框和隐藏)呈现复选框输入控件,因为如果未选中该复选框,则浏览器不会为复选框输入字段发送值。如果不使用自动映射,则需要解析从表单中接收的输入值。

使用此简单规则检测复选框:

var rawFollow = Request.Form["Follow"];
if (rawFollow.Contains("true"))
{
  // do something
}   

答案 2 :(得分:1)

据我所知,额外的隐藏字段是因为如果未选中该复选框,则该输入将不会随表单一起提交,因此我们需要隐藏字段的值为false

所以唯一可以想到的解决方案是:

var rawFollow = Request.Form["Follow"];
var rawFollows = rawFollow.Split(',');
if (rawFollows.Count() > 1)
{
   rawFollow = rawFollows[0];
}

但是这看起来很糟糕(如果页面上元素的顺序怎么样,如果出于某种原因隐藏字段是FIRST,那么它总会评估为false),这就是为什么我想知道MVC源是如何做到的。