vista ventajas tutorial net mvc modelo form ejemplo controlador asp asp.net-mvc razor binding model action

asp.net-mvc - ventajas - mvc c# tutorial



Atascamiento del modelo MVC de objetos complejos (2)

Primero, creo que debe usar Model lugar de campaign en los atributos de nombre, como a continuación:

name="@Model.Countries[@country.i].Id"

Y ahora su bucle foreach generará el código html como a continuación:

<input type="checkbox" name="1" value="1"/> <input type="checkbox" name="2" value="2" checked=""checked""/>

Con el código anterior, el enlace del modelo no funcionará, es por eso que obtuvo valores nulos cuando envió el formulario. Necesitas algo como a continuación:

<input id="Countries_0__IsSelected" name="Countries[0].IsSelected" type="checkbox" value="true"/> <input name="Countries[0].IsSelected" type="hidden" value="false"/> <input checked="checked" id="Countries_1__IsSelected" name="Countries[1].IsSelected" type="checkbox" value="true"/> <input name="Countries[1].IsSelected" type="hidden" value="false"/>

Así que te sugiero que uses la sintaxis de Razor , como a continuación:

foreach (var country in Model.Countries.Select((value,i)=> new {i, value})) { @Html.CheckBoxFor(m => m.Countries[@country.i].IsSelected ) }

He leído e implementado muchas respuestas aquí y en la web, pero no tuve suerte.

Mi modelo se ve así:

public class CampaignModel : BaseModel { . . public List<TreeItem> Countries { get; set; } . . }

En la vista que tengo:

@foreach (var country in Model.Countries.Select((value,i)=> new {i, value})) { <input type="checkbox" name="campaign.Countries[@country.i].Id" value="@country.value.Id" @(country.value.IsSelected ? "checked=/"checked/"" : "") /> }

En la acción que tengo:

[HttpPost] public ActionResult UpdateTargeting(CampaignModel campaign) { return View(campaign); }

Pero la propiedad ''Países'' resulta nula.

¿Qué estoy haciendo mal? Gracias


Terminé agregando 2 campos ocultos más para identificar la casilla de verificación exacta.

El TreeItem dice así:

public class TreeItem { public int Id { get; set; } public string Title { get; set; } public bool IsSelected { get; set; } public List<TreeItem> Leafes { get; set; } public TreeItem() { } public TreeItem(int id, string title, bool selected = false, List<TreeItem> leafes = null) { Id = id; Title = title; IsSelected = selected; Leafes = leafes; } }

La solución completa se ve así (demuestro una jerarquía de 2 niveles):

<ul id="devicesList"> @foreach (var brand in Model.DeviceBrands.Select((value, i) => new { i, value })) { <li> @Html.CheckBoxFor(m => m.DeviceBrands[@brand.i].IsSelected) @Html.HiddenFor(m => m.DeviceBrands[@brand.i].Id) @Html.HiddenFor(m => m.DeviceBrands[@brand.i].Title) <label><b>@brand.value.Title</b></label> <ul> @foreach (var deviceModel in brand.value.Leafes.Select((value, j) => new { j, value })) { <li> @Html.CheckBoxFor(m => m.DeviceBrands[@brand.i].Leafes[@deviceModel.j].IsSelected) @Html.HiddenFor(m => m.DeviceBrands[@brand.i].Leafes[@deviceModel.j].Id) @Html.HiddenFor(m => m.DeviceBrands[@brand.i].Leafes[@deviceModel.j].Title) <label>@deviceModel.value.Title</label> </li> } </ul> </li> } </ul>

Gracias Lin!