【问题标题】:Bind Checkboxes to int array/enumerable in MVC将复选框绑定到 MVC 中的 int 数组/可枚举
【发布时间】:2012-01-21 23:14:25
【问题描述】:
@Html.CheckBox("orderNumbers", new { value = 1 })
@Html.CheckBox("orderNumbers", new { value = 2 })
@Html.CheckBox("orderNumbers", new { value = 3 })
@Html.CheckBox("orderNumbers", new { value = 4 })
@Html.CheckBox("orderNumbers", new { value = 5 })

[HttpPost]
public ActionResult MarkAsCompleted(IEnumerable<int> orderNumbers) { }

[HttpPost]
public ActionResult MarkAsCompleted(IEnumerable<string> orderNumbers) { }

如果我在我的操作方法中使用第一个签名,我会得到一个空的IEnumerable

如果我使用第二个签名,我确实收到了值,但我也收到了未选中值的错误值(因为 MVC 模式使用隐藏字段隐藏所有复选框)。

例如我会收到类似orderNumbers = { "1", "2", "false", "4", "false" }

为什么我不能只得到数字列表?

【问题讨论】:

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


    【解决方案1】:

    因为这就是所提供的CheckBoxFor 助手的工作方式。

    您必须自己为复选框生成 html。然后不会生成隐藏的输入,您只会得到选定的整数值。

    【讨论】:

    • 确实,我当然知道。真是个傻瓜!我错误地认为如果它们不能绑定到请求的类型,他们会在模型绑定器中做一些聪明的事情来忽略错误值。
    【解决方案2】:

    您可以通过以下方式获取所有选中的值。

    控制器代码:

        public ActionResult Index()
        {            
            return View();
        }
    
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(string[] orderNumbers)
        {
            return View();
        }
    

    查看代码:

    @using (Html.BeginForm())
    {
        <input name="orderNumbers" type="checkbox" value="1" />
        <input name="orderNumbers" type="checkbox" value="2" />
        <input name="orderNumbers" type="checkbox" value="3" />
        <input name="orderNumbers" type="checkbox" value="4" />
        <input name="orderNumbers" type="checkbox" value="5" />
    
        <input type="submit" name="temp" value="hi" />
    }
    

    请记住一件事,您需要为所有复选框指定相同的名称。在数组中,您将获得所有选中复选框的值。

    【讨论】:

      【解决方案3】:

      除了 alok_dida 的出色回答。由于所有值都是整数,因此您可以让控制器代码采用整数数组并避免自己进行转换。

      这适用于 MVC4+:

      [AcceptVerbs(HttpVerbs.Post)]
      public ActionResult Index(int[] orderNumbers)
      {
          return View();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-06
        • 2023-03-06
        • 1970-01-01
        • 2012-08-19
        • 2016-03-13
        • 2011-12-06
        • 2013-06-21
        • 2011-08-04
        相关资源
        最近更新 更多