今天早上我有一些麻烦,从我的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