ASP.NET MVC Modell Binding IList in einer Editorvorlage

8

Ich versuche, eine Liste zu binden, die Teil eines größeren Ansichtsmodells ist, ohne auf einen benutzerdefinierten Modellbinder zurückzugreifen. Wenn ich eine Editorvorlage verwende, um die Liste der Eingaben zu erstellen, haben die generierten Namen nicht das richtige Format, damit der Standardordner funktioniert.

Anstelle von Items [3]. Ich würde gerne erwarten, dass Items Items sind. [3] .Id. Wenn ich die Liste ohne eine Editor-Vorlage erstelle, funktioniert es wie erwartet.

Mache ich etwas offensichtlich falsch oder ist das nur eine Eigenart von Html.Hidden und Html.TextBox?

%Vor%

Index.aspx

%Vor%

ItemList.ascx

%Vor%

Ausgabe

%Vor%

Bearbeiten (Aktionsmethode)

%Vor%

Bearbeiten Sie # 2

HttpPost Aktion

%Vor%

Index.aspx

%Vor%     
A Bunch 17.10.2010, 00:28
quelle

2 Antworten

7

Ich habe Ihr Problem verstanden, und vielleicht habe ich auch eine Lösung:)!

Lassen Sie mich zuerst erklären, was ich gelernt habe, indem ich den Quellcode des Frameworks untersucht habe (es ist immer eine gute Idee, einen Opensource zu inspizieren) Quellcode des Projekts, um besser zu verstehen, wie bestimmte Dinge funktionieren).

1 -) Bei Verwendung von einfachen stark typisierten HTML-Helfern (dh allen Html.xxxFor (...) Methoden außer EditorFor und DisplayFor ) in dem Lambda-Ausdruck, der die zu rendernde Eigenschaft des Modells definiert, ist der Name des erzeugten HTML-Elements gleich dem String, der folgt " model = & gt; ", minus was vorher kommt" = & gt; ", das heißt:

  • Die Zeichenfolge " Modell ", wenn das Modell eine Sammlung ist
  • oder die Zeichenfolge " Modell. " (beachten Sie am Ende die Zeichenfolge ". ").

Also zum Beispiel:

%Vor%

erzeugt diese HTML-Ausgabe:

%Vor%

Und das:

%Vor%

erzeugt dies:

%Vor%

== & gt; Dies erklärt teilweise, warum Sie diese "seltsame" HTML-Ausgabe haben, wenn Sie EditorFor verwenden.

2 -) Wenn Sie komplexe stark typisierte Helfer (EditorFor und DisplayFor) verwenden, wird dieselbe vorherige Regel in der zugehörigen Teilansicht angewendet ( ItemList.ascx in Ihrem Fall) und zusätzlich werden alle generierten HTML-Elemente mit vorangestellt, was nach "== & gt;" folgt, wie in erklärt > 1 -) .

Das Präfix hier ist " Elemente. ", weil Sie dies in Ihrer typisierten Ansicht (Index.aspx) haben:

%Vor%

== & gt; Dies erklärt vollständig die Ausgabe und warum der Standardbinder nicht mehr mit Ihrer Elementliste funktioniert

Die Lösung besteht darin, Ihren ItemWrapper -Parameter in der [HttpPost] -Methode in seine Eigenschaften zu zerlegen und dann Attribut binden mit seinem Parameter Präfix für jede komplexe Eigenschaft wie folgt:

%Vor%

(vorausgesetzt, dass ItemWrapper auch eine einfache Eigenschaft namens Foo vom Typ string hat)

Um Konflikte zu vermeiden, empfehle ich beim Auflisten der Eigenschaften in der post-Methode dringend, dass Sie Ihre Parameter entsprechend dem Namen jeder Eigenschaft benennen (nicht wie in der Fall), wie ich.

Hoffe, das wird helfen!

    
tinesoft 01.11.2010, 13:42
quelle
-1

Eine trügerischere Lösung besteht darin, nur jQuery zu verwenden, um Instanzen dieser Art zu "reparieren". Führen Sie einfach die folgende Funktion aus, nachdem die Seite (oder Teilseite) geladen wurde:

%Vor%     
Itamaram 05.11.2010 02:52
quelle

Tags und Links