Modell Bindung Postbacks Daten an einen Controller-Aktion Parameter vom Typ List
-
18-09-2019 - |
Frage
Ich habe eine starke Typ Ansicht vom Typ
List<List<MyViewModelClass>>
Die äußere Liste wird immer zwei Listen von List<MyViewModelClass>
haben. Für jede der beiden äußeren Listen möchte ich eine Gruppe von Kontrollkästchen angezeigt werden soll. Jeder Satz kann eine beliebige Anzahl von Möglichkeiten.
Meine Ansicht Modell Klasse sieht wie folgt aus:
public class MyViewModelClass
{
public Area Area { get; set; }
public bool IsGeneric { get; set; }
public string Code { get; set; }
public bool IsChecked { get; set; }
}
So ist die letzte Ansicht wird in etwa so aussehen:
Bitte wählen Sie diejenigen, die gelten:
Erste Reihe von Optionen:
- x Option 1
- x Option 2
- x Option 3
- etc.
Zweite Reihe von Möglichkeiten:
- x Zweite Option 1
- x Zweite Option 2
- x Zweite Option 3
- x Zweite Option 4
- etc.
Ankreuzfelder sollten MyViewModelClass.Area.Name
anzuzeigen, und deren Wert sollte auf MyViewModelClass.Area.Id
bezogen werden. Geprüft Zustand ist natürlich im Zusammenhang mit MyViewModel.IsChecked
.
Frage
Ich frage mich, wie soll ich Html.CheckBox()
oder Html.CheckBoxFor()
Helfer verwenden, um meine Kontrollkästchen angezeigt werden? Ich muss diese Werte auf einem Postbacks natürlich an den Server zurück.
Ich mag meine Controller-Aktion wie eine von ihnen haben:
public ActionResult ConsumeSelections(List<List<MyViewModelClass>> data)
{
// process data
}
public ActionResult ConsumeSelections(List<MyViewModelClass> first, List<MyViewModelClass> second)
{
// process data
}
Wenn es macht die Dinge einfacher, könnte ich eine separate Ansicht Modelltyp wie machen:
public class Options
{
public List<MyViewModelClass> First { get; set; }
public List<MyViewModelClass> Second { get; set; }
}
Neben Änderung meiner erste Version der Controller-Aktion an:
public ActionResult ConsumeSelections(Options data)
{
// process data
}
Lösung 2
Lösung
Es stellt sich heraus, das gar nicht so kompliziert ist. Alles was Sie tun müssen, ist Ihre Kontrollen benennen angemessen und alles wird miteinander verbunden sein, wie es sein sollte. Damit. Was auch immer Ihre Kontrollen, sollten sie immer so genannt werden:
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"
...
Alles wird erhalten diese gebunden Controller Aktionsparameter (die zweite hat eine andere Sammlung in einer Sammlung) List<SomeType> first
.
Sehr wichtiger Hinweis
Wenn Sie hinzufügen / entfernen Sie diese Steuerelemente dynamisch mit Javascript, müssen Sie sicherstellen, dass Indizes in Folge ausgehend von 0 sind, und keine Lücken aufweisen. Und Sie werden in einer Sammlung eine schöne Arbeits App mit dynamischer Anzahl von Elementen haben.
Sie können über sie in mein Blog veröffentlicht auch.
Andere Tipps
Generell erstelle ich einen Typ (Modell), dass „Modelle“ die Ansicht, die ich erstellen möchten. d.
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: Hier finden Sie aktuelle diesen Beitrag , wie es ist genau das, was Sie wollen!