1

更新:从代码中可以看出,我跳过了一个复选框 (4)。我这边的愚蠢错误!

我的视图中有 16 个复选框,我希望它们中的每一个都绑定到模型中布尔数组(或 BitArray)中的一个元素。

如果我尝试这样做,在提交表单后,控制器只会获取数组的前 4 个元素(虽然是正确的值),所以我尝试在模型的构造函数中分配更多空间,但控制器永远不会得到叫。有什么办法可以让它工作,还是每个复选框都需要一个布尔变量?

数组:

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 个都起作用了。

4

1 回答 1

2

渲染的 html 是做什么用的Checkboxfor?第 5 个复选框是否未选中?如果值为 true,则仅在表单集合中提交复选框。如果值为 false,则不会发送。MS MVC 需要一个从零开始的数组值的不间断索引。

因此,如果选项 1-4 被选中,则选项 5 未被选中,选项 6-16 被选中,仅将 1-4 水合到视图模型中。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" />
于 2012-07-30T14:05:51.567 回答