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!