Ответ 1
Вместо этого используйте список и замените цикл foreach
циклом for
:
@model IList<BlockedIPViewModel>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@for (var i = 0; i < Model.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(x => x[i].IP)
@Html.CheckBoxFor(x => x[i].Checked)
</td>
<td>
@Html.DisplayFor(x => x[i].IP)
</td>
</tr>
}
<div>
<input type="submit" value="Unblock IPs" />
</div>
}
В качестве альтернативы вы можете использовать шаблон редактора:
@model IEnumerable<BlockedIPViewModel>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.EditorForModel()
<div>
<input type="submit" value="Unblock IPs" />
</div>
}
а затем определите шаблон ~/Views/Shared/EditorTemplates/BlockedIPViewModel.cshtml
, который будет автоматически отображаться для каждого элемента коллекции:
@model BlockedIPViewModel
<tr>
<td>
@Html.HiddenFor(x => x.IP)
@Html.CheckBoxFor(x => x.Checked)
</td>
<td>
@Html.DisplayFor(x => x.IP)
</td>
</tr>
Причина, по которой вы получаете нуль в своем контроллере, заключается в том, что вы не уважали соглашение об именах для ваших полей ввода, которые связующее устройство по умолчанию ожидает, чтобы успешно привязать к списку. Я приглашаю вас прочитать following article
.
Как только вы его прочитали, посмотрите на сгенерированный HTML (а точнее на имена полей ввода) с моим примером и вашим. Затем сравните, и вы поймете, почему ваш не работает.