2011-11-18 52 views
11

假設我在ASP.NET MVC 3應用程序中具有以下結構。爲什麼我的.cshtml頁面需要定義內容?

  • 物品
    • Index.cshtml
  • 分類
  • 共享
    • _Index.cshtml
    • _Site.cshtml
    • Index.cshtml

兩個Index.cshtml文件使用_Index.cshtml作爲佈局頁面和_Index嵌套在_Site佈局中。

Items/Index實現_Index中定義的可選部分。 Shared/Index是空的。

Items/Index視圖正常工作。由於類別沒有索引,因此它使用共享文件夾中的一個。這不起作用。

它拋出

的 「RenderBody」 方法沒有被調用的頁面佈局 「〜/查看/共享/ _Index.cshtml」 的錯誤。

如果_Site電話RenderBody,並從_Site_Index繼承,不_Index內容滿足所要求的RenderBody通話和Shared/Index.cshtml可以是空白的?

我問的原因是因爲我有一個ASP.NET MVC 1應用程序,它使用母版頁實現了這種結構,它工作正常,但將其轉換爲帶有Razor的MVC 3導致了此問題。

這裏是什麼,我描述的基本輪廓:

_Site.cshtml

<!DOCTYPE html> 
// head 
<body> 
    @RenderBody() 
</body> 

_Index.cshtml

@{ 
    Layout = "~/Views/Shared/_Site.cshtml"; 
} 

<div id="sub-menu"> 
    // Markup 
</div> 

// More markup 

@RenderSection("SectionOne", required: false) 

@RenderSection("SectionTwo", required: false) 

筆數/ Index.cshtml(工作)

@{ 
    Layout = "~/Views/Shared/_Index.cshtml"; 
} 

@section SectionOne { 
    // Markup 
} 

Shared /Index.cshtml(RenderBody錯誤)

@{ 
    Layout = "~/Views/Shared/_Index.cshtml"; 
} 

// Rest of this file is empty 

回答

11

我不知道我跟你完全,但ALL佈局頁必須有一個RenderBody(),即使他們嵌套。 RenderBody()呈現「孩子」的內容。嵌套佈局頁面時,嵌套佈局是父項的子項,輸出必須在RenderBody中呈現。同樣,孩子的孩子必須將其身體放入中間頁面。

換句話說,任何不在@部分的東西都被認爲是「身體」。因此,_Index.cshtml需要呈現它的正文(Index.cshtml),而_Site.html必須呈現它的正文(_Index.cshtml)。它上升了鏈條。

編輯:

似乎佈局必須呈現的至少一個部分,具有RenderBody()RenderSection()是它。雖然這些部分是可選的,但至少渲染一個部分不是。將一個空白部分添加到您的Index.cshtml或將RenderBody()添加到您的_Index.cshtml。

+0

雖然我的_Index.cshtml不會調用@RenderBody。 _Index只是實現_Site中的部分,並定義了一些新的部分。然後項目/索引實現一些_Index部分。而已。 – Brandon

+0

@Brandon - 如果你包含一些基本的cshtml代碼說明,可能會有幫助,因爲我只是不明白你在描述什麼。 –

+0

已更新的問題。也許我沒有正確實現嵌套頁面,但基本上是它的結構。 – Brandon

相關問題