今天早上我有一些麻煩,從我的MVC應用程序中的複選框組中檢索選定的值。我將此發送給我的團隊,並認爲我會與其他人分享。
當回發的複選框值,所有瀏覽器的標準行爲是從後徹底離開了未選中的複選框回。所以如果你有一個沒有被選中的複選框,那麼在Request.Form中沒有任何東西顯示出來。這是大多數開發人員所說的一個相當着名的現象。
在ASP.Net MVC當你使用Html.Checkbox,它試圖解決這個問題,並確保你有回發的值(在這種情況下,「假」)爲未選中的複選框。這是通過添加包含值'false'的隱藏字段來完成的。
例如,
<%= Html.CheckBox("Sites", s.Selected, new { value = s.Value })%>
可生產的HTML
<input id="Sites" name="Sites" type="checkbox" value="1" /><input name="Sites" type="hidden" value="false" />
這是所有良好和不好,直到您嘗試使用複選框組。這是多個具有相同名稱的複選框,其中值以單個逗號分隔的字符串形式發回。 如果將該值定義爲數組(字符串[]站點),則MVC可以自動爲您自動分割該字符串。
這裏的視圖代碼:
<% foreach(var s in Model) { %>
<li><%= Html.CheckBox("Sites", s.Selected, new { value = s.Value })%>
<label><%= s.Name %></label>
</li>
<% } %>
適當的控制器動作:
的[AcceptVerbs(HttpVerbs.Post) 公衆的ActionResult編輯(INT標識,字符串名稱,字符串SubmissionUrl,字符串[]位點)
不幸的是,因爲Html.Checkbox產生這個隱藏字段的值,以及,得到的陣列不僅包含選定複選框的值,但對於每個未選中的複選框還「假」。你得到一個數組,看起來是這樣的:
[0] 'false'
[1] 'false'
[2] '110'
[3] '50'
[4] 'false'
如果「假」是未被選中的複選框,並整數是對於那些複選框的選中狀態的值。
這可以把你的代碼出了不少,如果你只爲你的複選框的值的整數和要定義的結果作爲一個整數數組,像這樣:
公衆的ActionResult編輯(INT標識,字符串名稱,字符串SubmissionUrl,int []站點)
由於無法將字符串值'false'轉換爲整數,導致拋出異常。
解決的方法很簡單,只需要避免Html.Checkbox並手動在您的視圖代碼中創建的複選框這樣的:
<% foreach(var s in Model) { %>
<li><input type="checkbox" name="Sites" value="<%=s.Value%>" <% if (s.Selected) { %>checked="checked"<% } %> />
<label><%= s.Name %></label>
</li>
<% } %>
希望這可以幫助其他人!
是的,它的確如此。我懷疑我不得不放棄HTML幫手。 – quakkels 2010-12-10 22:49:29