Как я могу использовать Html.Checkbox для удаления повторяющихся групп в ASP.NET MVC? - PullRequest
1 голос
/ 08 августа 2009

Я борюсь с Html.Checkbox в ASP.NET MVC. Представьте себе сотрудника с повторяющейся группой детей:

альтернативный текст http://img220.imageshack.us/img220/7208/deletechildrensnapshotk.png

Кнопка «Добавить ребенка» работает нормально, но я не могу надежно использовать «Удалить выбранных детей». Я рендеринг чекбоксов с этим:

<% int i = 0; %>
<% foreach (var item in Model.Children) { %>   
    <tr>
        <td>
        <%=Html.CheckBox("childrenToDelete[" + i + "]", false, new {value = item.Name})>
        </td>
    </tr>
<% i++; %>
<% } %>

Вот как мое действие контроллера получает список дочерних элементов для удаления из коллекции FormCollection:

var childrenToDelete = new List<string>();
UpdateModel(childrenToDelete, "childrenToDelete");

Затем я создаю объект, используя шаблон ViewModel, который содержит Employee и List of Child. Я не могу понять, почему в 85% случаев я выбрасываю исключение в представлении в строке Html.Checkbox. Примерно в 15% случаев все работает нормально. Исключение составляет «Ошибка преобразования параметра из типа System.String в тип System.Boolean». IE отображает:

  • FormatException: строка не была распознана как допустимое логическое значение.
  • FormatException: Bobby не является допустимым значением для логического значения.

Конечно, "Бобби" не является логическим значением, поэтому он терпит неудачу. Любая подсказка о том, почему Html.Checkbox пытается использовать «Бобби» в качестве логического значения? Тот же ViewModel отлично работает для добавления детей, поэтому я не думаю, что у меня там ошибка.

Ответы [ 2 ]

4 голосов
/ 08 августа 2009

Помощник Html.CheckBox добавляет скрытое поле в форму. Я бы посоветовал вам назначить уникальный идентификатор каждому элементу в коллекции Children, а затем использовать его в форме вместо использования помощника:

<% foreach (var child in Model.Children) { %>
    <input type="checkbox" name="childrenToDelete" value="<%=child.Id%>" />
<%}%>

А потом в вашем контроллере действие:

public ActionResult DeleteChildren(string[] childrenToDelete) 
{
    // childrenToDelete array will contain selected ids of children to delete
    return View();
}
0 голосов
/ 09 августа 2009

Наконец-то, я думаю, я понял это. Я не осознавал, что Html-помощники получают свои значения из следующих мест (по словам Стивена Сандерсона из Pro Pro.NET MVC Framework):

  1. ViewData.ModelState [ "CONTROLNAME"]. Value.RawValue
  2. Параметр "value" передан вспомогательному методу HTML или если вы вызвали перегрузку, которая не содержит параметр "value", то ViewData.Eval ("controlName")

Поскольку моя форма является постбэк, мои HTML-помощники пытались сначала получить свои значения из ModelState. Пример результата - «Бобби, ложь», когда вы пытаетесь удалить Бобби. Это, вероятно, портит Html.CheckBox, так что я не собираюсь тратить время на расследование. Как указывает @darin, обходной путь без помощи Html Helpers работает просто отлично.

Я не мог понять это дольше всего, так как моя Модель была правильной. Я даже не думал смотреть на ModelState. Вероятно, не помогло то, что я еще не читал раздел о проверке в книге Сандерсона.

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