Сегодня утром у меня возникли проблемы с получением выбранных значений из группы флажков в моем приложении 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>
<% } %>
Надеюсь, это поможет кому-то еще!