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

Resuelto muttley91 asked hace 9 años • 2 respuestas

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

Esto es lo que intenté primero, pero está claro que esto no funcionará ya que baso las entradas en los elementos pasados ​​a través de la AllItemscolección, que no tiene conexión con los elementos del propio usuario.

<div id="item-list">
    @foreach (var item in Model.AllItems)
    {
        <div class="ui field">
            <div class="ui toggle checkbox">
                <input type="checkbox" id="[email protected]" name="Items" value="@item.Active" />
                <label for="[email protected]">@item.ItemName</label>
            </div>
        </div>
    }
</div>
muttley91 avatar Apr 09 '15 22:04 muttley91
Aceptado

No puede vincularse a una colección mediante un foreachbucle. Tampoco debería generar manualmente su html, que en este caso no funcionaría porque las casillas de verificación no marcadas no se devuelven. Utilice siempre los asistentes HTML fuertemente tipados para obtener el enlace correcto del modelo bidireccional.

No ha indicado cuáles son sus modelos, pero suponiendo que tiene Usery desea seleccionar Rolespara 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<RoleVM>();
  }
  public int ID { get; set; }
  public string Name { get; set; }
  public List<RoleVM> 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);
}

Vista

@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)
  }
  <input type"submit" />
}

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

[HttpPost]
public ActionResult Edit(UserVM model)
{
  // Loop through model.Roles and check the IsSelected property
}
 avatar Apr 10 '2015 06:04