Nehmen wir an, ich schreibe eine Blog-Webanwendung mit MVC-Muster. Ein typisches Layout für die Hauptseite der Blog-Anwendung ist - eine Art Post-Index im Hauptteil. Abgesehen davon gibt es einige zusätzliche Teile wie die Zeitleiste, das Tag-Navigationsfeld, das Abonnement-Feld usw. Diese Steuerelemente werden auch in einem einzelnen angezeigt Post-Ansicht und kann in anderen Ansichten erscheinen, die ich habe.
Meine Frage ist - wie soll ich mit diesen Panels in meinen Ansichten und Controllern umgehen? Ich sehe hier drei Ansätze:
Erstellen Sie eine große Ansichtsmodellklasse, die alle Informationen enthält, die zum Rendern der Ansichten erforderlich sind (entweder Index oder einzelner Beitrag). In diesem Fall könnte ich diese Seitenbereiche zu Teilansichten machen und sie aus der Ansicht aufrufen, die über einen Teil dieses großen Ansichtsmodells gerendert wird. Der Nachteil ist - ich werde das Code-Füll-Ansichtsmodell auf verschiedene Controller-Methoden verteilen, was bedeutet, dass der Code dupliziert wird. Welches ist ziemlich schlecht.
Erstellen Sie eine weitere Ebene für das Rendern von Ansichten. Angenommen, die oberste Ebene des Renderns empfängt bereits gerenderte Teile von HTML oder Funktionen, die beim Aufruf ein HTML ausgeben. Die Ebene unter dieser "Teilebene kombinieren" würde nur Teilansichten für jedes gewünschte Bedienfeld ergeben, einschließlich Hauptinhalt. Der Nachteil hier - Speichernutzung. Die meisten modernen Frameworks rendern htmls direkt in den Ausgabestream, aber bei diesem Ansatz werden Teilansichten zuerst in Zeichenfolgenobjekte gerendert - was zu Speicheraufwand führt.
- Verwenden Sie so etwas wie "RenderAction" von asp.net mvc, das eine Controller-Methode aus einer Ansicht aufruft. Ich denke, dies ist eine schlechteste Lösung von 3 gegeben, weil es einen MVC-Ansatz fallen lässt.
Die Frage ist nicht an einen bestimmten Rahmen gebunden, ich möchte die allgemeine Vorgehensweise verstehen.
AKTUALISIEREN
Nach einer Antwort habe ich herausgefunden, dass der Beitrag nicht klar ist. Also vernünftiges Update hier:
Unter dem Begriff viewmodel verstehe ich ein Objekt, das alle Daten enthält, die zum Rendern einer bestimmten Ansicht erforderlich sind.
Bei allen drei Ansätzen werden Teilansichten mit einem eigenen Ansichtsmodell erstellt. Zum Beispiel (mit C # -Syntax):
class SinglePostViewModel {
string Text {get;set;}
string Title {get;set;}
string Slug {get;set;}
DateTime PublishedDate {get;set;}
...
}
class TagNavigationPanelViewModel {
string TagText {get;set;}
int PostsCount {get;set;}
}
class CalendarNavigationPanelViewModel {
DateTime YearAndMonth {get;set;}
int PostsCount {get;set;}
}
Meine Frage ist - wie man diese Teilansichten gut miteinander kombiniert.