【问题标题】:How to mimic MVC's checkbox -> bool model binding?如何模仿 MVC 的复选框 - > bool 模型绑定?
【发布时间】:2011-12-24 03:37:25
【问题描述】:

我有一个显示复选框的编辑器模板:

@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" />

当未选中的框未发送到服务器或其他东西时,隐藏字段与餐饮有关。

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

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

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

有人可以帮忙吗?或者,如果有人可以指出 MVC 源代码中发生这种情况的位置,我可以自己看一下,但不确定从哪里开始。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    顺便说一句,你不应该使用 Request.Form["Follow"] 你的 Action 方法应该有一个像这样的参数而不是 "bool?follow"

    【讨论】:

    • 我不明白你在说什么。首先,我不负责渲染复选框/隐藏字段,当我调用Html.CheckBoxFor 时,MVC 会这样做。如果我将该字段重命名为“dummy”,并且我取消选中该字段,那么Request.Form["Follow"] 中将不会有一个值,所以它不会工作。这就是为什么隐藏字段在那里。至于旁注,我不能使用参数,因为正如我在问题中所说,这不是动作方法,这是基本控制器中的方法,由动作手动执行。我不想用那个额外的参数乱扔我所有的操作方法。
    • 对不起,我误读了您的帖子 - 我以为您正在尝试编写自己的控件来模仿和替换内置复选框。我现在看到您只想使用 MVC 提供的一个但访问它。您的解决方案看起来不错 - 我会使用 string contains 方法来查找 true 或 false 而不是拆分。这样字段的顺序就无关紧要了
    【解决方案2】:

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

    使用这个简单的规则来检测复选框:

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

    【讨论】:

    • 我认为这与自动映射器无关。它是内置的 MVC 默认模型绑定来完成这项工作。
    【解决方案3】:

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

    所以唯一能想到的解决办法是这样的:

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

    但这看起来很奇怪(页面上元素的顺序呢,如果由于某种原因隐藏字段是 FIRST,那么它总是会评估为 false),这就是为什么我想知道 MVC 源代码是如何做到这一点的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-24
      • 2013-03-06
      • 2015-03-02
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多