更新:原来我从代码中可以看到跳过了一个复选框(4)。来自我身边的愚蠢错误!
我的视图中有16个复选框,我希望它们中的每一个都绑定到模型中bool数组(或BitArray)中的元素。
如果我尝试这样做,在提交表单之后,控制器只获取数组的前4个元素(虽然是正确的值),所以我试着在模型的构造函数中分配更多的空间但是然后控制器会从来没有被叫过。有什么方法可以让它工作,或者我是否需要每个复选框的bool变量?
数组:
public bool[] ActiveSettings { get; set; }
查看:
<p><b>Active Settings:</b></p>
<div style="float:left">
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[0]) val0<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[1]) val1<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[2]) val2<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[3]) val3<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[5]) val4<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[6]) val5<br />
@*etc..*@
</div>
这是控制器中调试器的屏幕截图(应该是bool [16]):
我使用Html.EditorFor测试了一个整数数组的相同的东西,它工作得很好。
谢谢!
更新
所以我最终做的是设置这样的隐藏字段:
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[0]) val0<br />
@Html.Hidden("NetworkSettings.ActiveSettings[0]",false)
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[1]) val1<br />
@Html.Hidden("NetworkSettings.ActiveSettings[1]",false)
等...
这里有一个奇怪的注意事项:我有16个复选框,我只需要为前5个设置隐藏字段,然后神奇地将所有16个复选框都工作。
答案 0 :(得分:2)
Checkboxfor
的渲染html是什么?并且未选中第5个复选框?如果值为true,则仅在表单集合中提交复选框。如果值为false,则不会发送。 MS MVC要求数组的基于零的零值索引。
因此,如果选中选项1-4,则取消选中选项5,仅检查选项6-16,并将其水合到视图模型中。 5不是表单集合的一部分,而6-16则被忽略。
要解决此问题,需要提交与复选框同名的隐藏字段。隐藏字段的值为false。 modelbinder将首先使用复选框值。如果它不存在,则提交false
的默认值并将被使用。标记看起来像这样
<input type="checkbox" id="networksettings_activesettings_4" name="networksettings.activesettings[4]" value="true" />
<input type="hidden" id="networksettings_activesettings_4_hidden" name="networksettings.activesettings[4]" value="false" />