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%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:
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
(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!
Tags und Links asp.net-mvc modelbinders