2012-07-30 119 views
1

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]):
enter image description here

我测试与使用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个工作。

+1

使用foreach循环。我不知道它是否能解决您的问题,但它更优雅。 – 2012-07-30 14:01:15

+0

你有GOT在开玩笑,真的解决了问题!干杯。 – 2012-07-30 14:08:06

+0

哇!如果你的代码不优雅,asp.net mvc真的会插入隐藏的错误:) – 2012-07-30 14:23:49

回答

2

什么是呈现的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" /> 
+0

设置隐藏字段的工作,并感谢您的解释! – 2012-07-30 15:05:50

相关问题