Razor嵌套布局与层叠部分

Chr*_*sen 77 viewengine razor asp.net-mvc-3

我有一个使用Razor作为其视图引擎的MVC3站点.我希望我的网站可以换肤.大多数可能的皮肤都足够相似,可以从共享的主布局中获得.

因此,我正在考虑这个设计:

计划视图

但是,我希望能够RenderSection在底层调用_Common.cshtml,并让它渲染一个在顶层定义的部分,Detail.cshtml.这不起作用:RenderSection显然只渲染下一层定义的部分.

当然,我可以定义每个皮肤中的每个部分.例如,如果_Common需要调用RenderSection("hd")中定义的部分Detail,我只需将其放在每个部分中_Skin并且它可以工作:

@section hd {
    @RenderSection("hd")
}
Run Code Online (Sandbox Code Playgroud)

这导致一些代码重复(因为每个皮肤现在必须具有相同的部分)并且通常感觉很乱.我还是Razor的新手,似乎我可能会遗漏一些明显的东西.

调试时,我可以在WebViewPage.SectionWritersStack中看到已定义部分的完整列表.如果我可以告诉RenderSection在放弃之前查看整个列表,它会找到我需要的部分.唉,SectionWritersStack是非公开的.

或者,如果我可以访问布局页面的层次结构并尝试在每个不同的上下文中执行RenderSection,我可以找到我需要的部分.我可能错过了什么,但我认为没有办法做到这一点.

除了我已经概述的方法之外,还有一些方法可以实现这个目标吗?

mar*_*ind 35

事实上,这在今天使用公共API是不可能的(除了使用部分重定义方法).使用私人反思可能会有一些运气,但这当然是一种脆弱的方法.我们将研究在下一版Razor中使这个场景更容易.

与此同时,这里有几篇关于这个主题的博客文章:

  • 感谢您的回复,我一直在使用这种语法(如上所述)使用嵌套的Sections:@section hd {@RenderSection("hd")} ...它实际上对我有用,看起来我可以复制现有的嵌套MasterPages .我想我稍微误解了这个问题并认为这不会起作用. (3认同)
  • 问题和答案都有很大帮助,我也同意在下一版Razor中这应该更容易.您还应该启用部分视图也可以实现部分的可能性,目前不支持. (2认同)

小智 17

@helper ForwardSection( string section )
{
   if (IsSectionDefined(section))
   {
       DefineSection(section, () => Write(RenderSection(section)));
   }
}
Run Code Online (Sandbox Code Playgroud)

这可以做到这一点吗?