Mam witrynę MVC3 używającą Razor jako silnika widoku. Chcę, aby moja witryna umożliwiała skórowanie. Większość możliwych skórek jest na tyle podobnych, że mogą pochodzić ze wspólnego układu głównego.
Dlatego rozważam ten projekt:
Chciałbym jednak mieć możliwość wywołania RenderSection
dolnej warstwy _Common.cshtml
i renderowania sekcji zdefiniowanej w górnej warstwie Detail.cshtml
. To nie działa: RenderSection
najwyraźniej renderuje tylko sekcje zdefiniowane w następnej warstwie.
Oczywiście mogę zdefiniować każdą sekcję w każdej skórce. Na przykład, jeśli _Common
trzeba wywołać RenderSection("hd")
sekcję zdefiniowaną w Detail
, po prostu umieszczam to w każdej _Skin
i działa:
@section hd {
@RenderSection("hd")
}
Powoduje to pewne zduplikowanie kodu (ponieważ każda skórka musi teraz mieć tę samą sekcję) i generalnie sprawia wrażenie bałaganu. Wciąż jestem nowy w Razor i wygląda na to, że brakuje mi czegoś oczywistego.
Podczas debugowania widzę pełną listę zdefiniowanych sekcji w WebViewPage.SectionWritersStack. Gdybym mógł po prostu powiedzieć RenderSection, aby przejrzał całą listę przed rezygnacją, znalazłby sekcję, której potrzebuję. Niestety, sekcja SectionWritersStack jest niepubliczna.
Alternatywnie, gdybym mógł uzyskać dostęp do hierarchii stron układu i spróbować wykonać RenderSection w każdym innym kontekście, mógłbym zlokalizować potrzebną sekcję. Prawdopodobnie czegoś mi brakuje, ale nie widzę żadnego sposobu, aby to zrobić.
Czy istnieje sposób na osiągnięcie tego celu inny niż metoda, którą już opisałem?