【问题标题】:asp.net MVC checkbox headache!asp.net MVC 复选框头疼!
【发布时间】:2010-11-01 02:39:51
【问题描述】:

我已经看到很多与此主题相关的问题。

我正在使用 asp.net MVC 1.0

问题领域

如果我使用

<%= Html.CheckBox("Status", true) %>

那为什么它会渲染成这样

<input checked="checked" id="Status" name="Status" type="checkbox" value="true" /><input name="Status" type="hidden" value="false" />

我把它放在 foreach 循环中,我有 5 行。

当我提交表单时 true,true,true,false,false 然后我得到true,false,true,false,true,false,false,false

即为假 => 假。

为真 => 真,假

如果我使用

<input type="checkbox" value="true" name="Status" checked="checked" />

那我就不会放任自流了。

那么我该如何克服这个问题呢?

请不要在 formcollection 对象中使用循环并检查每个键来发布答案!

【问题讨论】:

标签: asp.net-mvc checkbox


【解决方案1】:

我知道这不是优雅的,但这就是我所做的:

collection["response"].Replace("true,false", "true").Split(',').ToList();

【讨论】:

    【解决方案2】:

    在您的示例中,当您使用 true,true,true,false,false 提交表单时,您会得到

    true,false,true,false,true,false,false,false
    有趣的是,您实际上并没有返回八个值,而是五个数组,看起来只是这样,因为所有的值已连接。

    我知道您要求不要为您的答案循环,但我可以用一个循环来演示这里真正发生的事情:
    foreach (string key in postedForm.AllKeys) {
        // "value" will contain a joined/comma-separated list of ALL values,
        // including something like "true,false" for a checked checkbox.
        string value = postedForm[key].GetValue;
        // "values" will be an array, where you can access its first element,
        // e.g., values[0], to get the actual intended value.
        string[] values = postedForm.GetValues(key);
    }
    

    因此,对于选中的框,您将获得一个包含两个元素的值数组,而对于未选中的框,您将获得一个单元素数组。

    因此,要回答您的问题您如何克服这个问题,答案在于使用 GetValues 而不是 GetValue,并将您发布的字段视为数组而不是字符串。

    祝你好运!

    【讨论】:

    • .Net4.0 的 MVC3 没有 GetValues
    【解决方案3】:

    我个人认为必须在服务器上到处检查“真、假”是一种痛苦。我编写了一个 jquery 修复程序,它将在选中一个框时删除由 Html.Checkbox 助手创建的额外隐藏字段,然后在未选中该框时将其添加回来。服务器值将始终为“真”或“假”。复选框列表在您希望它们如何操作方面有点主观,我对此进行了讨论,但我从值集中删除了“false”,这意味着如果列表中的所有框都未选中,则表单值将被排除。

    http://www.mindstorminteractive.com/blog/?p=386

    我使用这种技术取得了相当大的成功。如果您尝试并遇到问题,请告诉我。

    【讨论】:

      【解决方案4】:

      您必须为 CheckBox 值进行自己的模型绑定。

      从 FormCollection 或 Request.Form 中获取该 CheckBox id 的值列表,并将 true、false 替换为 true:

      string chkBoxString = Request.Form["checkboxID"].Replace("true,false", "true")
      

      现在你有一个 CheckBox 是否被选中的列表......剩下的你自己做:)

      【讨论】:

        【解决方案5】:

        之所以这样渲染,是因为默认绑定器要求 FormCollection 具有不可为空的参数的值。使用这种技术,我们可以确保即使未选中复选框也会发送值(默认情况下,仅在选中时发送值)。如果您仅使用一个 html 输入来使用此控制器方法,您将在未选中复选框的表单发布时收到错误(不会发布复选框的值,并且活页夹将不知道如何使用 isItemSelected 的值):

        public ActionResult SomeActionMethod(bool isItemSelected)
        

        您可以尝试仅使用一个 html 输入来使用类似的东西:

        public ActionResult SomeActionMethod(bool? isItemSelected)
        

        但在这种情况下 isItemSelected 将为空或为真。而且它永远不会变成假的。

        【讨论】:

          【解决方案6】:

          根据您的要求,您可以采取多种方式。

          我用这个方法。

          <input type="checkbox" value="<%= item.ID %>" name="check" checked="checked")" />
          

          这是可能的复选框。

          在服务器端,我还将在模型中拥有一组项目 ID。 所以我检查它是否在数组中

          var strArray = form["checkbox"]; //Request.form["checkbox"] or "FormCollection form" in action parameter;  array of ID's in comma separated string.
          

          不同的人有不同的测试。

          【讨论】:

            【解决方案7】:

            这只是用于简单的 CheckBox,你想要的是 checkboxList,它还没有在 ASP.net MVC 的 API 中涵盖

            如果您正在寻找类似复选框列表的东西,也许您应该编写自己的帮助程序,前提是您对 HTML 有很好的理解..

            就是这样! :)

            【讨论】:

              【解决方案8】:

              更容易检查 AttemptedValue.Contains("true") - 如果它被选中,它会,如果它没有被选中......

              【讨论】:

                【解决方案9】:

                在视图中:

                <input id="radio5" type="checkbox" name="rb_abc" value="5"/>
                

                控制器:

                [AcceptVerbs(HttpVerbs.Post)]
                 public ActionResult YourForm(FormCollection fc)
                 { 
                      if (fc["rb_abc"] == "on")
                      {
                           //Hey .. you have selected a Radio Button.. just kidding.. its a CheckBox
                      }
                 }
                

                【讨论】:

                  【解决方案10】:

                  获取复选框值,即使它是真或假

                  var boolValue = bool.Parse(collection.GetValues("checkboxID")[0])
                  

                  【讨论】:

                    猜你喜欢
                    • 2011-01-05
                    • 2011-08-03
                    • 1970-01-01
                    • 2013-08-05
                    • 2011-05-16
                    • 2013-02-15
                    • 2011-02-19
                    • 2013-05-15
                    • 1970-01-01
                    相关资源
                    最近更新 更多