Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何模仿MVC';s复选框->;布尔模型绑定?_Asp.net Mvc_Asp.net Mvc 3_Checkbox_Model Binding - Fatal编程技术网

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

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

  • 您可以将隐藏的文本框重命名为任何名称,如“dummy”或与复选框名称不同的名称,以便请求;将只返回不需要拆分的复选框的值。您永远不需要检查“隐藏文本框”的值


  • 另一方面,你不应该使用请求。表单[“Follow”]你的操作方法应该有这样一个参数,而不是“bool?Follow”

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

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

  • 您可以将隐藏的文本框重命名为任何名称,如“dummy”或与复选框名称不同的名称,以便请求;将只返回不需要拆分的复选框的值。您永远不需要检查“隐藏文本框”的值


  • 另一方面,您不应该使用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”]
    中将不会有值,因此该选项不起作用。这就是为什么隐藏场在那里。至于旁注,我不能使用参数,因为正如我在问题中所说的,这不是一个动作