HTML.CheckBox постоянное состояние после POST - Обновить ModelState? - PullRequest
1 голос
/ 16 ноября 2009

У меня есть форма, состоящая из множества предметов (подумайте о порядке заказа на заказ амазонки). С каждой строкой связан флажок, поэтому пользователь может выбрать несколько элементов и нажать «удалить».

Форма построена примерно так:

<% for (int i = 0; i < Model.OrderItems.Count; i++) { %> 
<tr>
    <td><%= Html.Hidden(String.Format("OrderItems[{0}].Id", i), Model.OrderItems[i].Id)%>
        <%= Html.CheckBox(String.Format("OrderItems[{0}].Checked", i), Model.OrderItems[i].Checked)%></td>
    <td><%= Html.TextBox(String.Format("OrderItems[{0}].Name", i), Model.OrderItems[i].Name)%></td>
    <td><%= Html.TextBox(String.Format("OrderItems[{0}].Cost", i), Model.OrderItems[i].Cost)%></td>
    <td><%= Html.TextBox(String.Format("OrderItems[{0}].Quantity", i), Model.OrderItems[i].Quantity)%></td>
</tr>       
<% } %>

Подшивка модели отлично работает, и список заполнен правильно. Однако после того, как я обработаю запрос в действии (например, удалим соответствующие элементы) и вернусь к новому представлению, содержащему меньше элементов, состояние формы «полу» сохраняется. Некоторые флажки остаются установленными, хотя в модели редактирования все значения bool установлены на false.

У меня нет этой проблемы, если я возвращаю RedirectToActionResult, но использование этого в качестве решения кажется немного хакерской работой.

Я думаю, что мне нужно очистить / обновить ModelState или что-то похожее, но я не уверен, какие термины нужно искать, чтобы узнать, как это сделать.

Ответы [ 3 ]

0 голосов
/ 30 марта 2010

Я хотел бы увидеть код вашего контроллера, но думаю, что ваша viewModel заполняется по соглашению.

В вашем действии Index я предполагаю, что вы создаете новую viewModel. Попробуйте назвать это по-другому, назовите экземпляр indexViewModel, и он не будет автоматически собирать предыдущие данные viewModel.

0 голосов
/ 23 октября 2012

Ваша догадка, вероятно, верна, вам, вероятно, нужно позвонить

ModelState.Remove("OrderItems[{0}].Checked");

Кстати, использование Redirect обычно не считается хаком, на самом деле это хорошая практика, называемая Post Redirect Get (PRG).

0 голосов
/ 16 ноября 2009

Если вы проверите обработанный HTML, я думаю, вы найдете скрытый ввод с тем же именем, что и у вашего флажка; так работает HTML.Checkbox. Это приводит к отправке массива значений.

Это может быть причиной вашей проблемы.

Доброжелательность,

Dan

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