代码
<%=Html.CheckBox("SendEmail") %>
在呈现时评估两个HTML元素
这是一个错误吗?还是按设计?如果是设计,为什么?
我今天早上遇到了一些问题,从我的MVC应用程序中的复选框组中检索选定的值.我把它发给了我的团队,并认为我会与其他人分享.
回发复选框的值时,所有浏览器的标准行为是从帖子中完全省略未经检查的复选框.因此,如果您有一个未选中的复选框,则在Request.Form中没有显示任何内容.这是大多数开发人员所熟知的一个众所周知的现象.
在ASP.Net MVC中,当您使用Html.Checkbox时,它会尝试解决此问题,并确保您为未选中的复选框返回一个值(在本例中为"false").这是通过添加包含值'false'的隐藏字段来完成的.
例如.
<%= Html.CheckBox("Sites", s.Selected, new { value = s.Value })%>
生成HTML
这一切都很好,直到您尝试使用复选框组.这是一个具有相同名称的复选框,其中值以单个逗号分隔的字符串发回.如果将值定义为数组(string [] Sites),MVC可以自动为您分割此字符串.
这是视图代码:
<% foreach(var s in Model) { %>
适当的控制器动作:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(int Id,string Name,string SubmissionUrl,string [] Sites)
不幸的是,因为Html.Checkbox也会产生这个隐藏的字段值,结果数组不仅包含所选复选框的值,还包含每个未选中复选框的"false".你得到一个看起来像这样的数组:
[0] 'false' [1] 'false' [2] '110' [3] '50' [4] 'false'
其中"false"表示未选中的复选框,而"整数"是所选复选框的值.
如果您只有复选框值的整数并希望将结果定义为整数数组,这可以将代码抛出相当多,如下所示:
public ActionResult Edit(int Id,string Name,string SubmissionUrl,int [] Sites)
这会导致抛出异常,因为它无法将字符串值'false'转换为整数.
解决方案非常简单,只需避免使用Html.Checkbox并在视图代码中手动创建复选框,如下所示:
<% foreach(var s in Model) { %>
希望这有助于其他人!