2011-08-04 58 views
4

如果我做錯了什麼,我想開悟。我敢打賭,我是。在ASP.NET MVC中,使用@RenderSection的優點是什麼(與@RenderPage相比)?

如果我有我的看法頁面下面的代碼:

@{ 
    ViewBag.Title = "About Us"; 
} 

<h2>About</h2> 
<p> 
    sample content. 
</p> 
@section header 
{ 
    <div id="header"> 
     Chapter 3a: Creating a Consistent Look 
    </div> 
} 

...我也應該有我的頁面佈局的FF呈現部分(如果有的話),以防止異常的運行 - 時間:

@if (IsSectionDefined("header")) 
{ 
    @RenderSection("header") 
} 

但是,如果我沒有在最後的4行以上渲染部分(比如,我評論他們全部)之前檢查的部分,編譯器將不檢查,我有一節在我的視圖頁面中定義,並允許我構建和運行應用程序。在運行時,它只有這樣,當我運行的頁面,我會得到這個錯誤:

下面的章節已被定義,但對於佈局頁面「〜沒有被渲染 /查看/共享/ _Layout2.cshtml「:」標題「。

我的問題則是FF:

  1. 我們怎樣才能防止這種情況發生?是否有任何設置強制編譯器檢查丟失的@RenderSection代碼?
  2. 因爲我們需要在整個應用程序中手動搜索關鍵字@section,因此@section功能的使用不會使系統的可維護性降低(假設問題#1沒有正面答案)?
  3. 在這種情況下,使用@RenderSection而不是@RenderPage有什麼好處?
  4. 我們是否也可以使@section有條件?

回答

2

我從來沒有想過這是一個問題。這個概念與aspx語法中的佔位符相同,因此如果您的主頁中有2個佔位符,則應該在每個使用該主頁的頁面/視圖中包含2個內容。

Phil Haack在論壇上發表了一篇博客文章,並沒有直接解決你的擔憂,但它肯定是一件值得考慮的事情。

http://haacked.com/archive/2011/03/05/defining-default-content-for-a-razor-layout-section.aspx

+0

感謝您的快速回答。至於section與佔位符概念的關係,根據我的理解,在服務器端代碼中檢查是否存在佔位符對象(因爲如果該佔位符對象不能在後面的代碼中使用佔位符對象存在於你的頁面中),而字符串(比如「header」)在編譯時沒有被檢查。我希望我能正確理解你對佔位符的使用。謝謝! – nolisj

+0

其實不是。這不是它的工作原理。後面的代碼根本就沒有關係。實際上,因爲Mvc2 aspx視圖甚至沒有文件後面的代碼。我的意思是,在概念級別,標記等同於@RenderSection()語句,而標記等同於@section {}聲明。我並不是暗示他們的工作原理完全相同。儘管如此,我仍然確信在編譯時沒有檢查兩者。您可以嘗試在csproj中將標記設置爲true,並查看是否有任何改進。 –

+0

我明白你的意思。我以爲你指的是這個佔位符()而不是這個佔位符()。 至於他們的相似性(ContentPlaceHolder == @RenderSection(); Content == @section),據我所知,你似乎是正確的。然而,ContentPlaceHolder/Content對與@RenderSection()/ @ section對不同的是,ContentPlaceHolder/Content對(以及它們之間的關係)比@RenderSection()/ @更明顯/明確/可見。部分對。 – nolisj

2

我知道它老了,但如果有人通過此傳遞。

@RenderSection(「header」,required:false)通過這個,你可以在你的視圖頁面中有一個 @section header {}。

現在,您還可以從佈局中刪除檢查條件。 也由此有條件!

如果你想要它,你可以: @RenderSection(「header」,required:true),但如果你的視圖沒有一個@section頭部,它會拋出一個錯誤。

相關問題