HTML.CheckBox (string) оценивает два элемента HTML вместо одного - PullRequest
5 голосов
/ 17 декабря 2008

код

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

оценивается до двух элементов HTML при визуализации

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

Это ошибка? Или по замыслу? Если это так, то почему?

Ответы [ 3 ]

5 голосов
/ 23 декабря 2009

Сегодня утром у меня возникли проблемы с получением выбранных значений из группы флажков в моем приложении MVC. Я отправил это своей команде и решил поделиться этим со всеми.

При отправке обратных значений для флажков стандартным поведением всех браузеров является полное исключение не отмеченных флажков из обратной отправки. Поэтому, если у вас есть флажок, который не установлен, то в Request.Form для этого ничего не отображается. Это довольно известное явление, которое объясняется большинством разработчиков.

В ASP.Net MVC, когда вы используете Html.Checkbox, он пытается обойти это и гарантирует, что вы отправили значение (в данном случае «ложное») для не отмеченных флажков. Это делается путем добавления скрытого поля, содержащего значение «ложь».

Например.

<%= 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 может разделить эту строку автоматически, если вы определите значение как массив (string [] Sites).

Вот код просмотра:

<% 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, имя строки, строка SubmissionUrl, строка [] сайтов)

К сожалению, поскольку Html.Checkbox также генерирует значение этого скрытого поля, результирующий массив содержит не только значения для выбранных флажков, но также «false» для каждого не отмеченного флажка. Вы получаете массив, который выглядит примерно так:

[0] 'false'
[1] 'false'
[2] '110'
[3] '50'
[4] 'false'

Где 'false' для не отмеченных флажков, а целые числа - это значения для выбранных флажков.

Это может выкинуть ваш код совсем немного, если у вас есть только целые числа для значений ваших флажков и вы хотите определить результат как массив целых чисел, например:

public ActionResult Edit (int Id, имя строки, строка SubmissionUrl, int [] Sites)

В результате возникает исключение, поскольку оно не может преобразовать строковое значение «ложь» в целое число.

Решение очень простое, просто избегайте 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>
   <% } %>

Надеюсь, это поможет кому-то еще!

4 голосов
/ 17 декабря 2008

Когда ничего не помогает, прочитайте исходный код. :) это из 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.

Я не совсем уверен, насколько это полезно, но по крайней мере вы знаете намерение.

1 голос
/ 17 декабря 2008

Я думаю, что нашел что-то в сети , что напрямую связано с моим вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...