Estoy trabajando en una aplicación MVC donde el Item de la clase Model tiene una List<Colour> llamada AvailableColours como propiedad.
AvailableColours es un subconjunto de clases de Colour definido por el usuario. Me gustaría mostrar todas las instancias de Colour en una lista de casillas de verificación y, cuando se envían, AvailableColours es una List<Colour> que contiene las clases de Colour seleccionadas.
¿Cuál es la mejor manera de hacer esto en MVC?
Editar: mi código hasta ahora, ¡aunque creo que esta no es la forma más parecida a MVC de hacerlo!
Modelo
public class Item { public int ID { get; set; } public List<Colour> AvailableColours { get; set; } }Vista
@model MyNamespace.Models.Item @using MyNamespace.Models; @{ ViewBag.Title = "Create"; var allColours = new List<Colour>(); //retrieved from database, but omitted for simplicity } <h2>Create New Item</h2> @using (Html.BeginForm("Create", "Item", FormMethod.Post)) { <div> @Html.LabelFor(model => model.AvailableColours) @foreach (var colour in allColours) { <input type="checkbox" name="colours" value="@colour.Description" /> } </div> <input type="submit" value="Submit" /> }Controlador
[HttpPost] public ActionResult Create(Item item, string[] colours) { try { foreach (var colour in colours) { item.AvailableColours.Add(GetColour(colour));//retrieves from database return RedirectToAction("Index"); } } catch { return View(); } }Modelos
public class Item { public List<Colour> AvailableColours { get;set; } } public class Colour { public int ID { get; set; } public string Description { get; set; } public bool Checked { get; set; } } Tenga en cuenta la propiedad Checked
Ver para bucle
@using (Html.BeginForm("Create", "Item", FormMethod.Post)) { <div> @Html.LabelFor(model => model.AvailableColours) @for(var i = 0; i < Model.AvailableColours.Count; i++) { @Html.HiddenFor(m => Model.AvailableColours[i].ID) @Html.HiddenFor(m => Model.AvailableColours[i].Description) @Html.CheckBoxFor(m => Model.AvailableColours[i].Checked) @Model.AvailableColours[i].Description<br/> } </div> <input type="submit" value="Submit" /> }Tenga en cuenta el bucle for en lugar de foreach para habilitar el enlace del modelo y los campos ocultos para permitir que los valores se publiquen de nuevo en el controlador
Vinculación de modelo a una lista
Puesto de controlador
[HttpPost] public ActionResult Create(Item model) { //All the selected are available in AvailableColours return View(model); }Gracias por todos los consejos, invaluables, pero había un cambio más que necesitaba hacer antes de que mi programa se vinculara al modelo y era agregar un getter y un setter a la Lista como en:
public class CartViewModel { public List<CartRowViewModel> cartRows {get; set; } public CartViewModel() { this.cartRows = new List<CartRowViewModel>(); } }Asegúrese de agregar el constructor en la clase y declarar la lista dentro de ella. De lo contrario, se declararía como un valor nulo que no podrá establecer para más adelante.
public class Item { public Item(){ AvailableColours =new List<Color>(); } }