MVC3将复选框值的布尔型数组传递给控制器
UPDATE:原来我跳过了一个复选框(4),如代码中所示。愚蠢的错误从我身边!MVC3将复选框值的布尔型数组传递给控制器
我在我的视图中有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>
下面是在控制器中的调试程序的屏幕截图(应该是布尔[16]):
我测试与使用Html.EditorFor的整数数组一样,它工作得很好。
谢谢!
UPDATE:
所以我最后做的是设置这些隐藏字段是这样的:
@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个工作。
什么是呈现的Checkboxfor
的html?并且第五个复选框未选中?如果值为true,则仅在表单集合中提交复选框。如果该值为假,它只是没有发送。 MS MVC需要一个非破坏性的从零开始的数组索引。
因此,如果选项1-4被选中,选项5未被选中,选项6-16被选中只有1-4水合到视图模型中。 5不是表格集合的一部分,6-16被忽略。
要解决此问题,需要提交与复选框同名的隐藏字段。隐藏字段的值为false。模型绑定器将首先使用复选框值。如果不存在,则会提交并使用默认值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-30 15:05:50
使用foreach循环。我不知道它是否能解决您的问题,但它更优雅。 – 2012-07-30 14:01:15
你有GOT在开玩笑,真的解决了问题!干杯。 – 2012-07-30 14:08:06
哇!如果你的代码不优雅,asp.net mvc真的会插入隐藏的错误:) – 2012-07-30 14:23:49