c# - una - @model ienumerable
¿Cómo pasar la lista de IEnumerable al controlador en MVC, incluido el estado de la casilla de verificación? (1)
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<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>
Ahora tengo un controlador para recibir acción del botón de enviar:
public ActionResult BlockedIPList(IEnumerable<BlockedIPViewModel> lstBlockedIPs)
{
}
Pero estoy obteniendo un valor nulo para lstBlockedIPs al llegar a la acción del controlador. Necesito obtener el estado de la casilla de verificación aquí. Por favor ayuda.
Use una lista en su lugar y reemplace su ciclo foreach
con un ciclo 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>
}
Alternativamente, puede usar una plantilla de editor:
@model IEnumerable<BlockedIPViewModel>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.EditorForModel()
<div>
<input type="submit" value="Unblock IPs" />
</div>
}
y luego defina la plantilla ~/Views/Shared/EditorTemplates/BlockedIPViewModel.cshtml
que se representará automáticamente para cada elemento de la colección:
@model BlockedIPViewModel
<tr>
<td>
@Html.HiddenFor(x => x.IP)
@Html.CheckBoxFor(x => x.Checked)
</td>
<td>
@Html.DisplayFor(x => x.IP)
</td>
</tr>
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.