web-dev-qa-db-ja.com

MVCレイアウトVS MVCマスターページ

MVC4の学習を始めています。 Razorテンプレートまたはマスターページに基づいてビューを作成する2つの可能性に出会いました。

私は2つの実際的な違いを理解したいと思います

今のところ、マスターページを使用してビューを作成すると、いくつかのセクションをオーバーライドできることがわかります。たとえば、マスターが「左列」プレースホルダーと「ボディ」プレースホルダーを定義する場合、特定のビューのボディを定義できるだけでなく、「左列」セクションのコンテンツをレンダリングして、たとえばページが存在するコンテキストにバインドされています(検索ボックスから株価情報ビューアーまで)。また、マスターページは、他の構文よりも冗長性の低いRazorテンプレートを使用して定義することはできません(部分的に間違っています: someone この側面をハックできました)。

Razor Layoutsでは、特定のビューでオーバーライドできるページの連続ブロックoneのみを定義でき、複数のレイアウトを使用する必要があります(DRYを壊す)ページの他の部分の小さな変更のため。 以前のステートメントは正しいですか、または何か不足していますか?

明らかに、jQueryをうまく利用することでページの任意の部分にコンテンツをレンダリングできますが、それは別の問題です

Razorでセクションを使用できます。 Scott Guはそれらについてブログに書いています: http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

レイアウトでは、必要な数のセクションを定義できます。

<div id="leftMenu">
    @RenderSection("LeftMenu", required: false)
</div>

ビューでオーバーライドできます:

@section LeftMenu {
    <div>... here comes the left menu for this view ...</div>
}

セクションがビューで定義されているかどうかをテストし、そうでない場合はデフォルトのコンテンツを提供することもできます。

@if (IsSectionDefined("LeftMenu")) { 
    @RenderSection("LeftMenu")
}
else { 
    <div>Some default left menu</div>
}
26
Darin Dimitrov

MVC3以降、カミソリビューエンジンが導入されました。高レベルでは、ビューエンジンは基本的にビューを取得し、必要なHTMLをレンダリングします。 Razorは_layout.cshtmlファイルを使用し、マスターページに似た独自のテンプレートシステムです。ただし、MVC3および4にはWebForms View Engineと呼ばれる別のビューエンジンがあり、これはマスターページを使用します。 MVC1とMVC2のチュートリアルをそれぞれ見ると、マスターページが表示されます。 MVC3より前は、WebForms View Engineのみがありました。

現在、機能面では、どちらも似ています。マスターページではコンテンツプレースホルダーを定義でき、Razorではセクションを定義できます。 2つの大きな違いの1つは、ページのレンダリング方法です。マスターページは、ページを外側にレンダリングします。つまり、最初にマスターページ、次にコンテンツプレースホルダーを意味します。かみそりは再帰的で、最も内側のセクションから開始し、それを元に戻します。

かみそりのレイアウトの詳細については、このブログ投稿をご覧ください: http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections- with-razor.aspx

どちらが優先されるかという点では、両方のビューエンジンが存在します。しかし、私が強くお勧めするかみそりの構文を利用したい場合は、レイアウトシステムを使用する必要があります。 Razorでは、マスターページを使用できません。