¿Cómo pasar la lista de IEnumerable al controlador en MVC, incluido el estado de la checkbox?

Tengo una aplicación de mvc en la que estoy usando un modelo como este:

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

Ahora tengo una vista para enlazar una lista como esta:

 @model IEnumerable @using (Html.BeginForm()) { @Html.AntiForgeryToken() } @foreach (var item in Model) {   @Html.HiddenFor(x => item.IP) @Html.CheckBoxFor(x => item.Checked)   @Html.DisplayFor(modelItem => item.IP)   } 

Ahora tengo un controlador para recibir acción del botón de enviar:

  public ActionResult BlockedIPList(IEnumerable lstBlockedIPs) { } 

Pero estoy obteniendo un valor nulo para lstBlockedIPs al llegar a la acción del controlador. Necesito obtener el estado de la checkbox aquí. Por favor ayuda.

Use una lista en su lugar y reemplace su ciclo foreach con un ciclo for :

 @model IList @using (Html.BeginForm()) { @Html.AntiForgeryToken() @for (var i = 0; i < Model.Count; i++) {   @Html.HiddenFor(x => x[i].IP) @Html.CheckBoxFor(x => x[i].Checked)   @Html.DisplayFor(x => x[i].IP)   } 
}

Alternativamente, puede usar una plantilla de editor:

 @model IEnumerable @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.EditorForModel() 
}

y luego defina la plantilla ~/Views/Shared/EditorTemplates/BlockedIPViewModel.cshtml que se representará automáticamente para cada elemento de la colección:

 @model BlockedIPViewModel   @Html.HiddenFor(x => x.IP) @Html.CheckBoxFor(x => x.Checked)   @Html.DisplayFor(x => x.IP)   

La razón por la que obtuvo nulo en su controlador es porque no respetó la convención de nomenclatura para sus campos de entrada que el archivador de modelo predeterminado espera vincular correctamente a una lista. Te invito a leer el following article .

Una vez que lo haya leído, mire el HTML generado (y más específicamente los nombres de los campos de entrada) con mi ejemplo y el suyo. Luego compare y comprenderá por qué el suyo no funciona.