HTML.CheckBox(字符串)计算为两个HTML元素而不是一个

时间:2008-12-17 02:03:26

标签: asp.net-mvc

代码

<%=Html.CheckBox("SendEmail") %>

在呈现时评估两个HTML元素

<input id="SendEmail" name="SendEmail" type="checkbox" value="true" /> 
<input name="SendEmail" type="hidden" value="false" /> 

这是一个错误吗?还是按设计?如果它是设计的,为什么?

3 个答案:

答案 0 :(得分:5)

我今天早上遇到了一些麻烦,我在MVC应用中从一个复选框组中检索了选定的值。我把它发给了我的团队,并认为我会与其他人分享。

在回复复选框的值时,所有浏览器的标准行为是从帖子中完全省略未经检查的复选框。因此,如果您有一个未选中的复选框,则在Request.Form中没有显示任何内容。这是大多数开发人员所熟知的一个众所周知的现象。

在ASP.Net MVC中,当您使用Html.Checkbox时,它会尝试解决此问题,并确保您为未选中的复选框发回一个值(在本例中为“false”)。这是通过添加一个包含值'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" />

这一切都很好,直到您尝试使用复选框组。这是一个具有相同名称的复选框,其中值以单个逗号分隔的字符串发回。 如果将值定义为数组(string [] Sites),MVC可以自动为您分割此字符串。

这是视图代码:

<% foreach(var s in Model) { %>
              <li><%= Html.CheckBox("Sites", s.Selected, new { value = s.Value })%>
              <label><%= s.Name %></label>
              </li>
       <% } %>

适当的控制器操作:

的[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) { %>
          <li><input type="checkbox" name="Sites" value="<%=s.Value%>" <% if (s.Selected) { %>checked="checked"<% } %> />
          <label><%= s.Name %></label>
          </li>
   <% } %>

希望这有助于其他人!

答案 1 :(得分:4)

当其他所有方法都失败时,请阅读源代码。 :)这是来自HtmlHelper.cs:

            // Render an additional <input type="hidden".../> for checkboxes. This
            // addresses scenarios where unchecked checkboxes are not sent in the request.
            // Sending a hidden input makes it possible to know that the checkbox was present
            // on the page when the request was submitted.

我不确定这是多么有用,但至少你知道这个意图。

答案 2 :(得分:1)

我想我发现something on the web与我的问题直接相关。