Asp.net-Mvc-3

具有級聯部分的 Razor 嵌套佈局

  • April 2, 2011

我有一個使用 Razor 作為其視圖引擎的 MVC3 站點。我希望我的網站可以換膚。大多數可能的皮膚都非常相似,它們可以從共享的主佈局中派生出來。

因此,我正在考慮這種設計:

計劃視圖圖

但是,我希望能夠RenderSection在底層呼叫_Common.cshtml,並讓它呈現在頂層定義的部分,Detail.cshtml。這不起作用:RenderSection顯然只渲染下一層定義的部分。

當然,我可以定義每個皮膚中的每個部分。例如,如果_Common需要呼叫RenderSection("hd")中定義的部分Detail,我只需將其放在每個部分中即可_Skin

@section hd {
   @RenderSection("hd")
}

這會導致一些程式碼重複(因為現在每個皮膚都必須有相同的部分)並且通常感覺混亂。我還是 Razor 的新手,似乎我可能遺漏了一些明顯的東西。

調試時,我可以在 WebViewPage.SectionWritersStack 中看到已定義部分的完整列表。如果我可以告訴 RenderSection 在放棄之前查看整個列表,它會找到我需要的部分。唉,SectionWritersStack 是非公開的。

或者,如果我可以訪問佈局頁面的層次結構並嘗試在每個不同的上下文中執行 RenderSection,我可以找到我需要的部分。我可能遺漏了一些東西,但我沒有看到任何方法可以做到這一點。

除了我已經概述的方法之外,還有其他方法可以實現這一目標嗎?

這實際上在今天使用公共 API 是不可能的(除了使用部分重新定義方法)。使用私有反射可能會有一些運氣,但這當然是一種脆弱的方法。我們將研究在 Razor 的下一個版本中使這種情況更容易。

與此同時,這裡有幾篇我寫的關於這個主題的部落格文章:

  • <http://blogs.msdn.com/b/marcinon/archive/2010/12/08/optional-razor-sections-with-default-content.aspx>
  • <http://blogs.msdn.com/b/marcinon/archive/2010/12/15/razor-nested-layouts-and-redefined-sections.aspx>

引用自:https://stackoverflow.com/questions/5525602