すべてのエリアで同じレイアウトを使用するように強制します


87

私は次のプロジェクト構造を持っています:

  • / Views / Shared / _Layout;

  • / Areas / Area1 / Views / ControllerName / Index;

..。

  • / Areas / AreaN / Views / ControllerName / Index。

すべての領域に_Layout基本レイアウトとして使用するように強制する方法はありますか?

_ViewStartファイルを追加せずに(たとえば、ルーティング構成を介して)それを行う方法はありますか?

関連項目:

ASP.NET MVC 3かみそりViewStartファイルでさまざまなレイアウトを指定するにはどうすればよいですか?


回答:


154

次の名前のファイルを追加する必要があります。

_ViewStart.cshtml

各エリアビューフォルダの下:

/Areas/Area1/Views/_ViewStart.cshtml

そして、次のようにルートレイアウトを指すようにファイルを編集します。

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

これを機能させるために、ビューのレイアウトプロパティに値を指定する必要はありません。指定すると、グローバルレイアウトが上書きされます。

注:Tonyが述べたように、ルートレイアウトを指すように各ビューのレイアウトプロパティを編集できます、ビューをレイアウトと結合して変更するのは面倒なので、これは推奨される方法ではありません。

編集1

コードを使用してデフォルトのビューのレイアウトを設定する場合は、カスタムビューエンジンの作成を検討する必要があります。

カスタムについてGoogleに試してみてくださいRazorViewEngineRazorView

この記事は良い出発点になるかもしれません

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

私はこのようなことをしていませんが、私はあなたを正しい方向に向けていることを願っています


1
「_ViewStart」ファイルを追加せずに(たとえば、ルーティング構成を介して)それを行う方法はありますか?
ミハイル

2
ルーティング内ではそうは思いません。それらは2つの異なるものです。ルーティングは、現在のリクエストURLをRoutesTableに登録されているルートと一致させようとする役割を果たします。一致が見つかると、IMvcRouteHandlerが作成され、IHttpHandler(MvcHandler)がコントローラーのアクションを処理します。ご覧のとおり、これはビューやレイアウトとは何の関係もありません。これは、ルートがビューを返す必要がなく、jsonまたはxmlを返す可能性があるためです。したがって、ルーティングはこのようなものを実装するための正しい場所ではありません。
jupaol 2012年

_ViewStartAreaフォルダーに直接追加して、すべてのエリアに適用することもできます。
Artur

21

Jupaolによる答えを拡張する...

少なくともVS2013では、領域の作成時に_ViewStart.cshtmlファイルがデフォルトで追加されるため、すでにそこにあり、ルート_Layout.cshtmlを指すように彼がメモしているように内容を変更できます。次に、その領域の_Layout.cshtmlが使用されなくなったため、削除できます(現在は混乱の原因となる可能性があります)。

ただし、そのルートで実行されるルーティングを実行することにより、_Layout.cshtmlは領域を考慮する必要があります。
デフォルトの_Layout.cshtmlには、わずかな変更が必要なActionLinkヘルパーがいくつかあります。

Area = ""を設定して、RouteValueDictionaryパラメーターをActionLink呼び出しに追加します。空の文字列はルートレベルを参照することに注意してください。これにより、これらのリンクはエリア内から呼び出された場合でも正しく機能し、ルートから呼び出された場合でも機能します。

例えば:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>

2

以下を使用してレイアウトを指定します。

@ {Layout = "_Layout"; }

これを一度に簡単に変更したい場合。おそらく、それをビューバッグ変数として設定し、コントローラーに渡すことができます。さらに簡単にするために、他のコントローラーが継承するベースコントローラーを作成し、そこにあるビューバッグにレイアウトを割り当てることができます。

ルーティングを変更する必要がある理由がわからないか、おそらく私は理解していません。お役に立てれば :)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.