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.
Was ich mache, ist eine Variation / Kombination Ihrer Punkte 1 und 3. Ich kombiniere die Ansichtsmodelle in einer Containerklasse und verwende diese als "Haupt" -Ansichtsmodell. Die übergeben die Teile als Modelle an die Teiltöne.
Nach Ihrem Beispiel würde ich dieses Ansichtsmodell für die Standardseite erstellen:
In Default.cshtml
In _TagNavigationPanel.cshtml
Gehen Sie dann für eine einzelne Beitragsseite genauso vor:
Und erstellen Sie Ihre Ansichten (cshtml (s)) entsprechend
quelle
- Sie können mit allen drei Subviews eine einzelne „Behälter“ Ansicht erstellen
SinglePostView
,TagNavigationPanelView
undCalendarNavigationPanelView
. Sie können dieSinglePostView
Ansicht auch durch eine andere Ansicht ersetzen, die für eine Seite erforderlich ist. Auf diese Weise müssen Sie nur die "zentrale" (Beitrags-) Ansicht für verschiedene Seiten durch einen anderen Ansichtstyp (z. B. Liste der Beiträge) ersetzen, und die anderen Ansichten müssen nur mit den entsprechenden Daten aktualisiert und nicht ersetzt werden.Ihre Containeransicht (zum Beispiel
MyView
) sollte Verweise auf alle Unteransichten enthalten. Es kann verschiedeneupdate
Methoden geben, mit denen verschiedene Unteransichten aktualisiert werden. Zum Beispiel -updateCalendar(CalendarNavigationPanelViewModel calendarData)
oderupdatePost(SinglePostViewModel postData)
. Oder sogar eine einzelneupdate(IViewModel modelData)
- dann müssen Sie den Typ der (und die Besetzung) überprüfen, ummodelData
zu bestimmen, welche Ansicht aktualisiert werden sollquelle