2012-07-30 72 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

相關問題