Asp.net mvc 当第一个复选框未选中时,在MVC中提交复选框集合将生成null

Asp.net mvc 当第一个复选框未选中时,在MVC中提交复选框集合将生成null,asp.net-mvc,Asp.net Mvc,基本上我有一个字符串集合,我想在页面上将它们呈现为复选框。为此,我编写了以下代码: @for (var i=0; i< Model.AvailableCats.Length; i++) { <input type="checkbox" name="Cats[@i]" value="@Model.Cats[i]" @(Model.Cats.Contains(Model.AvailableCats[i]) ? "checked=checked" : "") /> @Mode

基本上我有一个字符串集合,我想在页面上将它们呈现为复选框。为此,我编写了以下代码:

@for (var i=0; i< Model.AvailableCats.Length; i++)
{
    <input type="checkbox" name="Cats[@i]" value="@Model.Cats[i]" @(Model.Cats.Contains(Model.AvailableCats[i]) ? "checked=checked" : "") /> @Model.AvailableCats[i]
}
(变量i=0;i 这将生成如下复选框

<input type="checkbox" checked="checked" value="Bengal" name="Cats[0]">
<input type="checkbox" checked="checked" value="Moggy" name="Cats[1]">

提交时,如果两项都选中,或者如果第一项都选中,则此操作正常,但如果仅选中第二项,则仅提交CAT[1],MVC不会将其映射到数组中


我确信答案很简单,但我如何提交我的复选框值集合?

这就是为什么
Html.checkbox
实际上在复选框输入之外添加了一个隐藏的输入元素。复选框只有在选中的情况下才会提交值,因此添加一个同名的隐藏输入意味着如果未选中,即使只是一个空字符串,也会提交一些内容

<input type="checkbox" checked="checked" value="Bengal" name="Cats[0]">
<input type="hidden" name="Cats[0]" value="">
<input type="checkbox" checked="checked" value="Moggy" name="Cats[1]">
<input type="hidden" name="Cats[1]" value="">

好的,答案很简单,只是每个都有相同的name属性。它不必是唯一的,如果提交了多个,MVC会将其绑定到一个集合中

<input type="checkbox" checked="checked" value="Bengal" name="Cats">
<input type="checkbox" checked="checked" value="Moggy" name="Cats">


我很惊讶它花了我这么长时间。

这很聪明,我认为你必须使用javascript技巧,但这很优雅。幸运的是,在我的例子中,如果没有提交值,这并不重要,但在许多重要的情况下,这会起作用。