Pregunta

Tengo un fuerte tipo de vista del tipo

List<List<MyViewModelClass>>

El exterior de la lista siempre tendrá dos listas de List<MyViewModelClass>.Para cada uno de los dos exteriores listas quiero mostrar un grupo de casillas de verificación.Cada uno de ellos puede tener un número arbitrario de opciones.

Mi punto de vista de la clase del modelo es similar a esta:

public class MyViewModelClass
{
    public Area Area { get; set; }

    public bool IsGeneric { get; set; }

    public string Code { get; set; }

    public bool IsChecked { get; set; }
}

Por lo que la vista final será algo parecido a:


Por favor seleccione las que apliquen:

El primer conjunto de opciones:

  • x Opción 1
  • x Opción 2
  • x Opción 3
  • etc.

Segundo conjunto de opciones:

  • x Segunda Opción 1
  • x Segunda Opción 2
  • x Segunda Opción 3
  • x Segunda Opción 4
  • etc.

Casillas debe mostrar MyViewModelClass.Area.Name, y su valor debe estar relacionado con MyViewModelClass.Area.Id.Comprueba el estado es, por supuesto, relacionados con la MyViewModel.IsChecked.

Pregunta

Me pregunto ¿cómo debo usar Html.CheckBox() o Html.CheckBoxFor() ayudante para mostrar mis casillas?Tengo que obtener estos valores en el servidor en una devolución de curso.

Me gustaría tener mi controlador de acción como uno de estos:

public ActionResult ConsumeSelections(List<List<MyViewModelClass>> data)
{
    // process data
}

public ActionResult ConsumeSelections(List<MyViewModelClass> first, List<MyViewModelClass> second)
{
    // process data
}

Si hace las cosas más simples, yo podría hacer una vista independiente del tipo de modelo como:

public class Options
{
    public List<MyViewModelClass> First { get; set; }

    public List<MyViewModelClass> Second { get; set; }
}

Así como el cambio de mi primera versión de controlador de acción:

public ActionResult ConsumeSelections(Options data)
{
    // process data
}
¿Fue útil?

Solución 2

Solución

Resulta que este no es tan complicado en absoluto. Todo lo que tiene que hacer es nombrar los controles de manera adecuada y todo va a ser unidos como debe ser. Entonces. Sean cuales sean sus controles, siempre deben ser nombrados como:

name="first[0].propName"
name="first[1].propName"
name="first[2].propName"
name="first[3].propName"
...

// or
name="first[0].data[0].property"
name="first[0].data[1].property"
name="first[0].data[2].property"
...
name="first[1].data[0].property"
name="first[1].data[1].property"
...

Todos estos logrará unido a List<SomeType> first parámetro acción del controlador (el segundo tiene otra colección dentro de una colección).

Nota muy importante
Si se agrega / eliminar estos controles de forma dinámica utilizando Javascript, usted tiene que asegurarse de que los índices son de partida consecutiva desde 0, y no tener cualquier hueco. Y que tendrá una aplicación de trabajo agradable con número dinámico de elementos de una colección.

Puede leer sobre él en mi blog también.

Otros consejos

En general creo un tipo (modelo) que los "modelos" la opinión de que quiero crear. es decir.

public class FooViewModel
{
    public List<Option> General { get; set; }
    public List<Option> Others { get; set; }

    //Some Methods and other properties
}
public FooController :...
{
    private FooViewModel fooViewModel = new FooViewModel();
}

Editar: Echar un vistazo a este post , ya que es exactamente lo que quiere!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top