web-dev-qa-db-ja.com

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

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

  • / Views/Shared/_Layout;

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

...

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

すべてのエリアに_ Layoutベースレイアウトとして使用するよう強制する方法はありますか

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

関連項目:

ASP.NET MVC 3 razor ViewStartファイルで異なるレイアウトを指定するにはどうすればよいですか?

79
Mikhail

次の名前のファイルを追加するだけです。

_ViewStart.cshtml

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

/Areas/Area1/Views/_ViewStart.cshtml

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

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

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

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

編集1

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

カスタムRazorViewEngineおよびRazorViewについてGoogleで試してください

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

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

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

144
Jupaol

Jupaolによる回答の拡大...

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

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

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

例えば。:

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

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

@ {Layout = "_Layout"; }

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

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

2
Tony