Ich habe das folgende Klassenlayout in MVC:
%Vor%Jetzt erstelle ich eine stark typisierte Ansicht in MVC dieses Typs und mache editierbare Textfelder, um jeden Wert zu bearbeiten, sowie eine foreach-Schleife, um Textfelder zu füllen, um die Elemente in der Liste eines Elements zu bearbeiten.
Wenn ich die Methode httppost einreiche, kommen die singulären Werte im reportmodel-Objekt wieder gut, aber die Liste wird im Objekt nicht zurückgegeben. Wie soll das gemacht werden?
Wenn ich httppost sage, dann beziehe ich mich auf die Methode, die MVC auf
zurückschickt %Vor%Code zum Posten der Liste von semanitem anzeigen
%Vor% Verwenden Sie nicht ElementAt(1)
in Ihren Lambda-Ausdrücken = & gt; Dies ruiniert die Namen der Eingabefelder. Bitte lies den Blogpost, den Kirill dir vorgeschlagen hat.
Sie können also den indizierten Zugriff verwenden:
%Vor% Um Indexerzugriff auf die Sammlung zu haben, wird natürlich vorausgesetzt, dass Ihre items
-Eigenschaft entweder als List<SomeItem>
oder SomeItem[]
deklariert ist. Wenn es ein IEnumerable<SomeItem>
ist, wird es nicht funktionieren. Ändern Sie einfach den Typ dieser Eigenschaft in Ihrem Ansichtsmodell.
Kirills Hinweis auf Scott Hanselmans Blog-Eintrag ist korrekt, aber Sie lesen es zu eng. Im gezeigten Beispiel übergibt er das Array an die Aktionsmethode, könnte aber ebenso gut im übergeordneten Modell enthalten sein. Das gleiche Konzept gilt.
Es ist jedoch wichtig zu wissen, dass der Standardmodellbinder keine verschachtelten Klassen instanziiert. Daher wird keine Instanz der List-Klasse erstellt, was bedeutet, dass sie immer null ist. Um dies zu beheben, müssen Sie die leere Listenklasse im Konstruktor instanziieren.
Dies ist jedoch nur ein Teil des Problems, da die Daten für die Bindung des Modellbinders korrekt formatiert werden müssen. Dies ist der Punkt, an dem der Blogpost von Scott eingeht, da er das Format bietet, das das Modellbinder benötigt, um die Daten als Liste zu erkennen.
Dies wird normalerweise für Sie gehandhabt, wenn Sie eine EditorTemplate verwenden und Html.EditorFor (m = & gt; m.Items) verwenden und dann eine SomeItem.cshtml EditorTemplate haben. Hier geht es um die Benennung von Sammlungselementen (sofern Sie auch stark typisierte Helfer in der Vorlage verwenden).
Tags und Links asp.net-mvc http-post