Question

J'ai une forte vue de type de type

List<List<MyViewModelClass>>

La liste externe aura toujours deux listes de List<MyViewModelClass>. Pour chacune des deux listes extérieures je veux afficher un groupe de cases à cocher. Chaque jeu peut avoir un nombre arbitraire de choix.

ressemble Selon moi, la classe de modèle similaire à ceci:

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

    public bool IsGeneric { get; set; }

    public string Code { get; set; }

    public bool IsChecked { get; set; }
}

le point de vue final ressemblera à quelque chose comme:


S'il vous plaît choisir ceux qui sont applicables:

La première série de choix:

  • x Option 1
  • x Option 2
  • x Option 3
  • etc.

Deuxième série de choix:

  • x Deuxième option 1
  • x Deuxième option 2
  • x Deuxième option 3
  • x Deuxième option 4
  • etc.

Les cases à cocher doit afficher MyViewModelClass.Area.Name, et leur valeur devrait être liée à MyViewModelClass.Area.Id. vérifia est bien sûr lié à MyViewModel.IsChecked.

Question

Je me demande comment dois-je utiliser Html.CheckBox() ou aide de Html.CheckBoxFor() pour afficher mes cases à cocher? Je dois obtenir ces valeurs au serveur sur un postback bien sûr.

Je voudrais avoir mon action de contrôleur comme un de ces:

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

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

Si cela rend les choses plus simples, je pouvais faire un type de modèle de vue séparée comme:

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

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

En plus de changer ma première version d'action de contrôleur:

public ActionResult ConsumeSelections(Options data)
{
    // process data
}
Était-ce utile?

La solution 2

Solution

Il se trouve ce n'est pas si compliqué du tout. Tout ce que vous avez à faire est de nommer vos contrôles de manière appropriée et tout sera lié ensemble comme il devrait être. Alors. Quels que soient vos commandes, ils doivent toujours être nommés comme:

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"
...

Tous ces va se lié à List<SomeType> first paramètre d'action du contrôleur (le second a une autre collection dans une collection).

Note très importante Si vous ajoutez / supprimer ces contrôles dynamiquement en utilisant Javascript, vous devez vous assurer que les index sont consécutifs départ de 0, et ne pas avoir des lacunes. Et vous aurez une application de travail agréable avec nombre dynamique d'éléments dans une collection.

Vous pouvez lire à ce sujet dans mon blog ainsi.

Autres conseils

En général, je crée un type (modèle) que « modèles » l'opinion selon laquelle je veux créer. i.e..

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();
}

Edit: Jetez un oeil à ce poste , comme il est exactement ce que vous voulez!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top