Hier ist ein Szenario: Nehmen wir an, ich habe eine Website mit zwei Controllern, die für die Anzeige verschiedener Arten von Inhalten zuständig sind - Seiten und Artikel. Ich muss Partial View in meine Masterpage einbetten, die nach bestimmten Kriterien gefilterte Seiten und Artikel auflistet und auf jeder Seite angezeigt wird. Ich kann Model nicht auf meiner Masterpage einrichten (habe ich Recht?). Wie löse ich diese Aufgabe mit Html.RenderPartial?
[BEARBEITEN] Ja, ich würde wahrscheinlich separate Teilansichten für die Auflistung von Artikeln und Seiten erstellen, aber es gibt trotzdem eine Barriere, die ich nicht auf der Masterpage festlegen kann und sollte. Ich muss irgendwie sagen "Hier sind die Seiten" als Argument für mein Renderpartial und auch für Artikel. Das gesamte Konzept von renderpartial mit Daten aus der Datenbank in Masterpages ist für mich etwas verschwommen.
Wie wäre es mit der Erstellung einer HtmlHelper-Erweiterungsmethode, mit der Sie ein Teilansichtsergebnis für eine Aktion auf dem Controller aufrufen können.
Etwas wie
%Vor%Sie könnten dies dann in Ihrer Masterseite wie
verwenden %Vor%und in Ihrem Controller die entsprechende Methode
%Vor%Nun, das sind sowieso meine 2 Cent
Ich hatte einen ähnlichen Beitrag und entwickelte ein Objektmodell, um damit umzugehen.
Ich HATE die nicht stark typisierten Ansichten so ging mit diesem Ansatz und es funktioniert gut.
Ich denke, dass Ihre Lösung im Land von MVC 2.0 RC und darüber hinaus liegen kann ...
Phil Haack hat einen Artikel in seinem Blog veröffentlicht: Ссылка
Die ViewData Model-Eigenschaft sollte nur für den Inhalt verwendet werden, den Sie im Hauptabschnitt der Benutzeroberfläche anzeigen / bearbeiten.
Andere Teile der Ansicht benötigen möglicherweise einige Daten in ViewData, also fügen Sie diese einfach zum Wörterbuch hinzu.
Ich würde einfach Daten aus dem Wörterbuch wie folgt übergeben: ViewData ["articles"] zu den partiellen. (oder ViewData.Get () von MvcContrib).
Sie können sich auch das kürzlich implementierte SubController-Muster ansehen, das in MvcContrib implementiert wurde.
Ja, das ist richtig. aber schauen wir uns dieses Szenario an: In Ansichten, die sich auf Artikel beziehen, habe ich ViewData ["article"] und in Ansichten, die sich auf Seiten beziehen, habe ich ViewData ["pages"], aber ich habe nicht beide Artikel und Seiten jederzeit verfügbar. Also, wenn ich hinzufügen:
Html.RenderPartial ("articlesView", ViewData ["articles"])
Html.RenderPartial ("pagesView", ViewData ["pages"])
Auf meiner Hauptseite wird eine Ausnahme auf jeder Seite ausgegeben, auf der ViewDataDictionary nicht beide Artikel und Seiten enthält.
Zumindest sehe ich das so.
Die Art, wie ich damit umgehe, ist die Verwendung eines BaseViewModels. Alle Ansichten werden stark gegen ein Ansichtsmodell typisiert, das von BaseViewModel erbt.
Die BaseViewModel-Klasse enthält alle von der MasterPage benötigten Informationen. Für die Navigation sieht Ihr BaseViewModel also so aus:
%Vor%In Ihrer MasterPage und PartialViews können Sie das Modell in BaseViewModel umwandeln und auf die NavigationsItems-Eigenschaft zugreifen.
%Vor%Dies ist eine sehr späte Antwort, aber ich bin auf diese Seite gekommen, während ich gegoogelt habe - also ist es wahrscheinlich, dass jemand anderes diese Frage (und meine Antwort) auch sehen wird.
Die Art, wie ich dieses Problem gelöst habe, besteht darin, ein einfaches jQuery-Skript zu verwenden, um ein PartialView zu laden und seinen Controller-Code auszuführen. Beispiel unten.
%Vor%Der große Nachteil dieses Ansatzes ist, dass der Client Scripting aktivieren muss, damit er funktioniert (also wirklich SEO-unfreundlich). Wenn das etwas ist, mit dem man leben kann, funktioniert es gut. Ich verwende es nur auf einer Intranetseite, wo ich weiß, dass jeder Client JavaScript aktiviert hat und ich mich nicht um Googles Bots kümmern muss.
Tags und Links asp.net-mvc asp.net master-pages html-helper renderpartial