我有一个使用 Razor 作为其视图引擎的 MVC3 站点。我希望我的网站可以换肤。大多数可能的皮肤都非常相似,它们可以从共享的主布局中派生出来。
因此,我正在考虑这种设计:
但是,我希望能够RenderSection
在底层调用_Common.cshtml
,并让它呈现在顶层定义的部分,Detail.cshtml
。这不起作用:RenderSection
显然只渲染下一层定义的部分。
当然,我可以定义每个皮肤中的每个部分。例如,如果_Common
需要调用RenderSection("hd")
中定义的部分Detail
,我只需将其放在每个部分中即可_Skin
:
@section hd {
@RenderSection("hd")
}
这会导致一些代码重复(因为现在每个皮肤都必须有相同的部分)并且通常感觉混乱。我还是 Razor 的新手,似乎我可能遗漏了一些明显的东西。
调试时,我可以在 WebViewPage.SectionWritersStack 中看到已定义部分的完整列表。如果我可以告诉 RenderSection 在放弃之前查看整个列表,它会找到我需要的部分。唉,SectionWritersStack 是非公开的。
或者,如果我可以访问布局页面的层次结构并尝试在每个不同的上下文中执行 RenderSection,我可以找到我需要的部分。我可能遗漏了一些东西,但我没有看到任何方法可以做到这一点。
除了我已经概述的方法之外,还有其他方法可以实现这一目标吗?