Asp.net mvc 如何模仿MVC';s复选框->;布尔模型绑定?
我有一个编辑器模板,它呈现出一个复选框:Asp.net mvc 如何模仿MVC';s复选框->;布尔模型绑定?,asp.net-mvc,asp.net-mvc-3,checkbox,model-binding,Asp.net Mvc,Asp.net Mvc 3,Checkbox,Model Binding,我有一个编辑器模板,它呈现出一个复选框: @Html.CheckBoxFor(model => model.Follow) var rawFollow = Request.Form["Follow"]; if (rawFollow.Contains("true")) { // do something } 它呈现出这样的效果: <input checked="checked" data-val="true" data-val-required="The Follow f
@Html.CheckBoxFor(model => model.Follow)
var rawFollow = Request.Form["Follow"];
if (rawFollow.Contains("true"))
{
// do something
}
它呈现出这样的效果:
<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
?我是否忽略了第二个字段?(例如隐藏字段)
我所做的是一个基本控制器(受保护的方法,从子控制器调用),所以我没有强类型视图模型,只有原始的请求
对象
有人能帮忙吗?或者,如果有人能指出MVC源代码中发生这种情况的地方,我可以自己看一看,但不确定从哪里开始看。据我所知,额外隐藏的字段是因为如果不选中复选框,该输入不会与表单一起提交,因此我们需要值为
false
的隐藏字段
因此,唯一的解决方案是我们可以想到的是:
var rawFollow = Request.Form["Follow"];
var rawFollows = rawFollow.Split(',');
if (rawFollows.Count() > 1)
{
rawFollow = rawFollows[0];
}
但这似乎有点不对劲(页面上元素的顺序如何,如果出于某种原因隐藏字段是第一个,那么它的计算结果总是为false),这就是为什么我想知道MVC源代码是如何做到这一点的。据我所知,额外隐藏字段是因为如果不选中复选框,该输入不会与表单一起提交,因此我们需要值为
false
的隐藏字段
因此,唯一的解决方案是我们可以想到的是:
var rawFollow = Request.Form["Follow"];
var rawFollows = rawFollow.Split(',');
if (rawFollows.Count() > 1)
{
rawFollow = rawFollows[0];
}
但这似乎有点骇人听闻(页面上元素的顺序如何,如果出于某种原因,隐藏字段是第一个,那么它的计算结果总是为false),这就是为什么我想知道MVC源代码是如何做到这一点的。你是对的,隐藏字段只是为了将表单提交给服务器。因为如果表单只有未选中的复选框,则不会提交任何内容,服务器也不知道如何将其设置为false
另一方面,你不应该使用请求。表单[“Follow”]你的操作方法应该有这样一个参数,而不是“bool?Follow”你是正确的,隐藏字段就是这样,表单将提交给服务器。因为如果表单只有未选中的复选框,则不会提交任何内容,服务器也不知道如何将其设置为false
另一方面,您不应该使用Request。Form[“Follow”]您的操作方法应该有这样一个参数,而不是“bool?Follow”MVC helper使用两个输入字段(复选框和隐藏字段)呈现复选框输入控件,因为如果未选中复选框,浏览器不会发送复选框输入字段的值。如果不使用自动映射,则需要解析从表单接收的输入值 使用以下简单规则检测复选框:
@Html.CheckBoxFor(model => model.Follow)
var rawFollow = Request.Form["Follow"];
if (rawFollow.Contains("true"))
{
// do something
}
MVC helper使用两个输入字段(复选框和隐藏)呈现复选框输入控件,因为如果未选中复选框,浏览器不会发送复选框输入字段的值。如果不使用自动映射,则需要解析从表单接收的输入值 使用以下简单规则检测复选框:
@Html.CheckBoxFor(model => model.Follow)
var rawFollow = Request.Form["Follow"];
if (rawFollow.Contains("true"))
{
// do something
}
我不明白你说的话。首先,我不负责呈现checkbox/hidden字段,当我调用
Html.CheckBoxFor
时,MVC会这样做。如果我将该字段重命名为“dummy”,并取消选中该字段,则Request.Form[“Follow”]
中将不会有值,因此该选项不起作用。这就是为什么隐藏场在那里。至于旁注,我不能使用参数,因为正如我在问题中所说的,这不是一个动作方法,这是一个基本控制器中的方法,由动作手动执行。我不想在我所有的动作方法中都添加那个额外的参数。对不起,我误读了你的帖子-我以为你是在试图编写自己的控件来模拟和替换内置的复选框。我现在明白了,您只想使用MVC提供的一个,但可以访问它。您的解决方案看起来不错-我将使用stringcontains方法来查找true或false,而不是split。这样一来,字段的顺序就不重要了。我不明白你说的是什么。首先,我不负责呈现checkbox/hidden字段,当我调用Html.CheckBoxFor
时,MVC会这样做。如果我将该字段重命名为“dummy”,并取消选中该字段,则Request.Form[“Follow”]
中将不会有值,因此该选项不起作用。这就是为什么隐藏场在那里。至于旁注,我不能使用参数,因为正如我在问题中所说的,这不是一个动作