I have an MVC3 site using Razor as its view engine. I want my site to be skinnable. Most of the possible skins are similar enough that they can derive from a shared master layout.
Therefore, I am considering this design:
However, I would like to be able to call RenderSection
in the bottom layer, _Common.cshtml
, and have it render a section that is defined in the top layer, Detail.cshtml
. This doesn't work: RenderSection
apparently only renders sections that are defined the next layer up.
Of course, I can define each section in each skin. For instance, if _Common
needs to call RenderSection("hd")
for a section defined in Detail
, I just place this in each _Skin
and it works:
@section hd {
@RenderSection("hd")
}
This results in some duplication of code (since each skin must now have this same section) and generally feels messy. I'm still new to Razor, and it seems like I might be missing something obvious.
When debugging, I can see the complete list of defined sections in WebViewPage.SectionWritersStack. If I could just tell RenderSection to look through the entire list before giving up, it would find the section I need. Alas, SectionWritersStack is non-public.
Alternatively, if I could access the hierarchy of layout pages and attempt execution of RenderSection in each different context, I could locate the section I need. I'm probably missing something, but I don't see any way to do this.
Is there some way to accomplish this goal, other than the method I've already outlined?
See Question&Answers more detail:os