Übergeben einer Sammlung an EditorFor in ASP.NET MVC

8

Ich habe eine langwierige Form, die ich in mehrere Teile zerlegt habe und @ Html.EditorFor für jeden Abschnitt verwende, der gut funktioniert, aber Ihre Gedanken braucht, ob dieser Ansatz verbessert werden kann oder nicht.

Es gibt Segmente und jedes Segment kann mehrere Aktivitäten haben, also habe ich eine Sammlung von Segmenten und jedes Segment in dieser Sammlung enthält eine Sammlung von Aktivitäten.

%Vor%

So wollte ich, dass das ViewModel, das ich als Modell für die Ansicht verwende, aussehen sollte, es aber nicht zum Laufen bringen konnte, da @ Html.EditorFor keinen Collection Type akzeptiert hat.

%Vor%

Hier ist das ViewModel

%Vor%

Hier ist der Editor für Vorlage für Segmente

%Vor%

Aber das funktioniert nicht, wenn man sagt, dass Editor keine Sammlungen aufnehmen kann und die Ausnahme auf RunTime geworfen wird.

Hier ist meine Arbeit Around. Ich habe eine andere Klasse "UglySegmentWorkAround" erstellt, die die Segment Collection enthält, und dann habe ich im UserPreferencesViewModel die List Property entfernt und stattdessen eine Eigenschaft dafür definiert.

%Vor%

und Hier ist der Editor für Vorlage.

%Vor%

Es funktioniert perfekt, aber ich fühle mich mit dieser Herangehensweise nicht wohl. Gibt es irgendetwas, das mir bei der ersten Annäherung fehlt? Wie sollte das gemacht werden? Ich möchte nicht, dass der EditorFor eine implizite Schleife ausführt, wenn ich ihm eine Collection übergebe, weil ich eine komplexe UI-Struktur im EditorFor rendere und den Editor benötige, um die Schleife darin zu haben.

    
Adil Khalil 26.09.2014, 21:34
quelle

1 Antwort

28

EditorFor wurde entwickelt, um Sammlungen für Sie zu durchlaufen. Es macht das automatisch. Wenn Sie eine Sammlung an einen EditorFor übergeben, ruft sie automatisch Ihre Vorlage für jedes Element in der Sammlung auf.

Wenn Sie ein Rendering für die Sammlung als Ganzes einrichten müssen, sollten Sie dies außerhalb des EditorFor-Aufrufs tun, entweder in Ihrem Ansichtscode oder in einer Teilansicht, die Ihren EditorFor aufruft.

Wenn Sie beispielsweise Ihren Code in eine Tabelle einfügen möchten, tun Sie dies (wobei MeineCollection List<MyItem> ist):

_MyCollectionPartial.cshtml

%Vor%

/Views/Shared/EditorTemplates/MyItem.cshtml

%Vor%

BEARBEITEN:

Vielleicht ist es besser, ein wenig bekanntes und schlecht dokumentiertes "Feature" von Editor-Vorlagen zu verwenden. Und dieses "Feature" ist, dass wenn Sie einen Vorlagennamen als Argument angeben, es nicht über die Sammlung iteriert. Sie können dieses Formular verwenden, um Ihre Sammelartikelvorlagen zu "umbrechen".

/Home/Index.cshtml

%Vor%

/Views/Shared/EditorTemplates/MyCollectionLayout.cshtml

%Vor%

/Views/Shared/EditorTemplates/MyItem.cshtml

%Vor%

HINWEIS: Ich sage "feature", weil dies viele Fragen zu SO ausgelöst hat, dass es nicht über Sammlungen iteriert, wenn der Vorlagenname explizit in den Argumenten angegeben wird.

    
Erik Funkenbusch 26.09.2014 23:58
quelle