Ich habe eine MVC3-Site, die Razor als Ansichtsmodul verwendet. Ich möchte, dass meine Website skinnbar ist. Die meisten möglichen Skins sind so ähnlich, dass sie von einem gemeinsam genutzten Master-Layout abgeleitet werden können.
Daher denke ich über dieses Design nach:
Ich möchte jedoch RenderSection
in der Lage sein, die unterste Ebene aufzurufen _Common.cshtml
und einen Abschnitt rendern zu lassen, der in der obersten Ebene definiert ist Detail.cshtml
. Dies funktioniert nicht: RenderSection
Anscheinend werden nur Abschnitte gerendert, die in der nächsten Ebene definiert sind.
Natürlich kann ich jeden Abschnitt in jeder Skin definieren. Wenn zum Beispiel ein in definierter Abschnitt _Common
aufgerufen werden muss , platziere ich diesen einfach in jedem und es funktioniert:RenderSection("hd")
Detail
_Skin
@section hd {
@RenderSection("hd")
}
Dies führt zu einer gewissen Duplizierung des Codes (da jeder Skin jetzt denselben Abschnitt haben muss) und fühlt sich im Allgemeinen unordentlich an. Ich bin noch neu bei Razor und es scheint, als würde mir etwas Offensichtliches fehlen.
Beim Debuggen wird die vollständige Liste der definierten Abschnitte in WebViewPage.SectionWritersStack angezeigt. Wenn ich RenderSection nur anweisen könnte, die gesamte Liste durchzusehen, bevor ich aufgebe, würde es den Abschnitt finden, den ich brauche. Leider ist SectionWritersStack nicht öffentlich.
Wenn ich alternativ auf die Hierarchie der Layoutseiten zugreifen und versuchen könnte, RenderSection in jedem unterschiedlichen Kontext auszuführen, könnte ich den gewünschten Abschnitt finden. Ich vermisse wahrscheinlich etwas, aber ich sehe keine Möglichkeit, dies zu tun.
Gibt es eine andere Möglichkeit, dieses Ziel zu erreichen, als die bereits beschriebene Methode?