Pase la lista de casillas de verificación a la vista y extraiga IEnumerable

Tengo una lista de elementos que se asociarán a un usuario. Es una relación de uno a muchos. Quiero que toda la lista de elementos pase a la vista para que puedan elegir entre los que todavía no están asociados (y también los que ya están asociados). Quiero crear casillas de verificación a partir de estos. Luego deseo enviar los seleccionados de vuelta al controlador para asociarlos. ¿Cómo puedo pasar la lista de todos ellos, incluidos los que aún no están asociados, y pasarlos de manera confiable para asociarlos?

Esto es lo que intenté primero, pero está claro que esto no funcionará ya que estoy basando las entradas de los elementos pasados ​​a través de la colección AllItems , que no tiene conexión con los elementos en el usuario mismo.

 
@foreach (var item in Model.AllItems) {
}

No puede vincularse a una colección mediante un bucle foreach . Tampoco debe generar manualmente su html, que en este caso no funcionaría porque las casillas no marcadas no se publican. Utilice siempre los helpers html fuertemente tipados para que obtenga el enlace correcto del modelo de 2 vías.

No ha indicado cuáles son sus modelos, pero suponiendo que tiene un User y desea seleccionar Roles para ese usuario, cree modelos de vista para representar lo que desea mostrar en la vista.

 public class RoleVM { public int ID { get; set; } public string Name { get; set; } public bool IsSelected { get; set; } } public class UserVM { public UserVM() { Roles = new List(); } public int ID { get; set; } public string Name { get; set; } public List Roles { get; set; } } 

En el método GET

 public ActionResult Edit(int ID) { UserVM model = new UserVM(); // Get you User based on the ID and map properties to the view model // including populating the Roles and setting their IsSelect property // based on existing roles return View(model); } 

Ver

 @model UserVM @using(Html.BeginForm()) { @Html.HiddenFor(m => m.ID) @Html.DisplayFor(m => m.Name) for(int i = 0; i < Model.Roles.Count; i++) { @Html.HiddenFor(m => m.Roles[i].ID) @Html.CheckBoxFor(m => m.Roles[i].IsSelected) @Html.LabelFor(m => m.Roles[i].IsSelected, Model.Roles[i].Name) }  } 

Luego, en el método de publicación, su modelo estará vinculado y puede verificar qué roles se han seleccionado

 [HttpPost] public ActionResult Edit(UserVM model) { // Loop through model.Roles and check the IsSelected property } 

Parece que no va a eliminar las casillas de verificación de forma dinámica, por lo que este problema es mucho más fácil de resolver. NOTA: La siguiente solución no funcionará como se espera si permite que los clientes o scripts eliminen dinámicamente las casillas de verificación de la página porque los índices ya no serán secuenciales.

El encuadernado MVC no es infalible, por lo que a veces hay que ayudarlo. La carpeta de modelo sabe que necesita vincularse a una propiedad llamada Elementos porque el nombre del campo de entrada es Artículos, pero no sabe Elementos es una lista. Asumiendo que en su controlador tiene una lista de elementos para vincular el modelo a los elementos llamados, lo que debe hacer es ayudar a MVC a reconocer que está vinculando a una lista. Para hacer esto, especifique el nombre de la lista y un índice.

 
@for (var i = 0; i < Model.AllItems.Count; i++) {
}

La línea clave aquí es esta:

Observe los artículos [@i]? Eso es decirle a la carpeta de modelos que busque una propiedad llamada Artículos y vincular este valor al índice en i para Artículos.