web-dev-qa-db-ja.com

RenderBody()とRenderSection()は、すべての子レイアウトに存在する必要がありますか?

3つのシンプルなレイアウトがありますが、

_ Layout.cshtml(これは基本レイアウトです)

_@RenderSection("something", required: false)
@RenderBody()
_

_ Main.cshtml

_@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section something {
   Hey I'm actually on the _Main layout.
}
_

Index.cshtml

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

アクションでインデックスビューをレンダリングしようとすると、このエラーが発生しました。

「RenderBody」メソッドは、レイアウトページ「〜/ Views/Shared/_Main.cshtml」に対して呼び出されていません。

ただし、__Main.cshtml_には既にRenderBody()がある親レイアウトがあります。私は間違っていますか、すべての子レイアウトに対してRenderBody()を呼び出す必要がありますか?

20
ocanal

はい、ネストに関係なく、すべてのレイアウトページにRenderBodyを含める必要があります。

@RenderBodyは、エンジンのプレースホルダーとして機能し、レイアウトページを使用してビューのコンテンツをドロップする場所を認識します。

23
Raciel R.

このコードは適切に動作するはずです:

_ Layout.cshtml

@RenderSection("something", required: false)
@RenderBody()

_ Main.cshtml

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
 }
@section something {
   Hey I'm actually on the _Main layout.
}

Index.cshtml

@{
    Layout = "~/Views/Shared/_Main.cshtml";
 }
<div id="Index Content Here">
 @RenderBody()
 </div>

index.cshtmlは、次のようにレンダリングする必要があります。

<head>
Hey I'm actually on the _Main layout.   
</head>
 <div id="Index Content Here">
</div>
</div>
7
Girish Gupta

セクションは、required: falseでレンダリングすることでオプションにすることができます

@RenderSection("SectionName", required: false)
1

最後のビューにセクションを含めるようにしてください。

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

@section something {
    content
}

PDATE: OK

@section something {
    Hey I'm actually on the _Main layout.
    @RenderSection("something", required:false)
}
enter code here
0
chromigo