Подтвердить что ты не робот

Как передать список IEnumerable контроллеру в MVC, включая состояние флажка?

У меня есть приложение mvc, в котором я использую такую ​​модель:

 public class BlockedIPViewModel
{
    public string  IP { get; set; }
    public int ID { get; set; }
    public bool Checked { get; set; }
}

Теперь у меня есть вид, чтобы связать список следующим образом:

@model IEnumerable<OnlineLotto.Web.Models.BlockedIPViewModel>
@using (Html.BeginForm())
{
  @Html.AntiForgeryToken()
}

@foreach (var item in Model) {
<tr>
    <td>

        @Html.HiddenFor(x => item.IP)           
        @Html.CheckBoxFor(x => item.Checked)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.IP)
    </td>

</tr>
}

<div>
    <input type="submit" value="Unblock IPs" />
</div>

Теперь у меня есть контроллер для приема действия из кнопки отправки:

 public ActionResult BlockedIPList(IEnumerable<BlockedIPViewModel> lstBlockedIPs)
 {

  }

Но я получаю значение null для lstBlockedIP при приходе в действие контроллера. Мне нужно получить состояние флажка здесь. Пожалуйста, помогите.

4b9b3361

Ответ 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 (а точнее на имена полей ввода) с моим примером и вашим. Затем сравните, и вы поймете, почему ваш не работает.