2011-11-18 5 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 
} 

共有/Index.cshtml(RenderBodyエラー)

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

// Rest of this file is empty 

答えて

11

私は、私は完全にあなたに従っわからないんだけど、ALLレイアウトページは、それらが入れ子になっている場合でも、RenderBody()を持っている必要があります。 RenderBody()は "子"のコンテンツをレンダリングします。ネストされたレイアウトページがある場合、ネストされたレイアウトは親の子であり、その出力はRenderBodyでレンダリングする必要があります。同様に、子供の子供は、その身体を中間ページにレンダリングする必要があります。

言い換えれば、@sectionにないものはすべて「ボディ」と見なされます。したがって、_Index.cshtmlはボディ(Index.cshtml)をレンダリングし、_Site.htmlはボディ(_Index.cshtml)をレンダリングする必要があります。それはチェーンを上っていく。

EDIT:

それは、レイアウトは、少なくとも1つのセクションをレンダリングすることがRenderBody()またはRenderSection()でなければならないことが表示されます。セクションがオプションであることは真実かもしれませんが、少なくとも1つのセクションをレンダリングすることはできません。 Index.cshtmlに空のセクションを追加するか、_Index.cshtmlにRenderBody()を追加します。

+0

私の_Index.cshtmlは@RenderBodyを呼び出しません。 _Indexは_Siteのセクションを実装するだけで、いくつかの新しいセクションを定義します。次に、Item/Indexは_Indexセクションのいくつかを実装します。それでおしまい。 – Brandon

+0

@Brandon - あなたが何を記述しているのか分からないので、基本的なcshtmlのコードをいくつか含めておけば助けになるかもしれません。 –

+0

更新された質問。たぶん、私は正しくネストされたページを実装していませんが、基本的にそれの構造です。 – Brandon