在MVC中将复选框绑定到int数组/可枚举对象

19
@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

如果我使用第二个签名,我确实会收到这些值,但是对于未选中的值也会收到 false 值(因为 MVC 阴影所有复选框都有一个隐藏字段的模式)。

例如,我将收到类似于 orderNumbers = { "1", "2", "false", "4", "false" } 的东西。

为什么我不能只获取数字列表?

3个回答

26
你可以通过以下方式获取所有选中的值。
控制器代码:
    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" />
}
请记住一件事,您需要为所有复选框赋相同的名称。在数组中,您将获得所有已选复选框的值。

7

这是因为所提供的CheckBoxFor帮助程序的工作方式。

您需要自己生成复选框的HTML。那么隐藏输入将不会生成,您将只获得所选整数值。


当然,我确实这么认为。真是个白痴!我错误地假设他们会在模型绑定器中做一些聪明的事情,以忽略那些无法绑定到请求类型的假值。 - fearofawhackplanet

5

除了alok_dida的很好的答案外。由于所有值都是整数,你可以让控制器代码接受一个整数数组,避免自己进行转换。

这在MVC4+中可行:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接