Domanda

Ho una forte visione del tipo

List<List<MyViewModelClass>>

L'elenco esterno avrà sempre due elenchi di List<MyViewModelClass>.Per ciascuno dei due elenchi esterni voglio visualizzare un gruppo di caselle di controllo.Ogni insieme può avere un numero arbitrario di scelte.

La mia classe del modello di visualizzazione è simile a questa:

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

    public bool IsGeneric { get; set; }

    public string Code { get; set; }

    public bool IsChecked { get; set; }
}

Quindi la vista finale sarà simile a:


Seleziona quelli applicabili:

Prima serie di scelte:

  • X opzione 1
  • X opzione 2
  • X Opzione 3
  • eccetera.

Seconda serie di scelte:

  • X Seconda opzione 1
  • X Seconda opzione 2
  • X Seconda opzione 3
  • X Seconda opzione 4
  • eccetera.

Dovrebbero essere visualizzate le caselle di controllo MyViewModelClass.Area.Name, e il loro valore dovrebbe essere correlato a MyViewModelClass.Area.Id.Lo stato controllato è ovviamente correlato a MyViewModel.IsChecked.

Domanda

Mi chiedo come dovrei usarlo Html.CheckBox() O Html.CheckBoxFor() helper per visualizzare le mie caselle di controllo?Ovviamente devo riportare questi valori sul server su un postback.

Vorrei che l'azione del mio controller fosse come una di queste:

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

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

Se semplifica le cose, potrei creare un tipo di modello di visualizzazione separato come:

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

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

Oltre a modificare la mia prima versione dell'azione del controller in:

public ActionResult ConsumeSelections(Options data)
{
    // process data
}
È stato utile?

Soluzione 2

Soluzione

Si scopre che non è affatto così complicato.Tutto quello che devi fare è nominare i tuoi controlli in modo appropriato e tutto sarà collegato insieme come dovrebbe essere.COSÌ.Qualunque siano i tuoi controlli, dovrebbero sempre essere nominati come:

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

Tutto ciò sarà vincolato List<SomeType> first parametro di azione del controller (il secondo ha un'altra raccolta all'interno di una raccolta).

Nota molto importante
Se aggiungi/rimuovi questi controlli dinamicamente utilizzando Javascript, devi assicurarti che gli indici siano consecutivi a partire da 0 e non presentino spazi vuoti.E avrai una bella app funzionante con un numero dinamico di elementi in una raccolta.

Puoi leggerlo in il mio post sul blog anche.

Altri suggerimenti

In genere creo un tipo (Model) che i "modelli" l'opinione che voglio creare. cioè.

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

Modifica: Date un'occhiata a questo post , in quanto è esattamente ciò che si vuole!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top