RazorビューでASP.NET MVC 3を使用しています。ビューを作成する場合は、ビューのレイアウト(マスターページ)を選択するか、デフォルトのまま(_Layout)を選択します。
再作成せずにビューを作成した後にこのレイアウトを変更するのは興味深いですが、ビューに関するレイアウト情報を保存する場所はありますか?そして、どうすれば変更できますか?
MVC3には、すべてのページのレイアウトを格納する_ViewStart.cshtml
があります。この要素を変更してすべてのページのレイアウトを変更するか、次のように@{}
ブロックのターゲットビューページの上部に新しいレイアウト要素を追加して、特定のページのレイアウトを変更できます。
@{
Layout = "~/Views/Shared/_newLayout.cshtml";
ViewBag.Title = "Index";
}
Cshtmlファイルの上部にビューを作成すると、レイアウトが含まれていることがわかります。
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
たとえば、それを別のレイアウトに簡単に置き換えることができます
@{
Layout = "~/Views/Shared/_Layout2.cshtml";
}
また、これを基本レイアウト(_ViewStart.cshtml
)そして、すべてのビューがそのレイアウトを使用します。
ビューに異なるレイアウトを指定するには、ニーズに応じて複数の方法があります。
他の回答で述べたように、ビューのLayout
プロパティを変更するだけです:
_@{
Layout = "~/Views/Shared/_CustomLayout.cshtml";
}
_
MVC 3 デフォルトを追加 _Views/_ViewStart.cshtml
_。すべてのビューで共有されるロジックを配置できます。追加のカスタムロジックのために、Viewsサブディレクトリに追加の__ViewStart.cshtml
_ファイルを作成することもできます(他のビューまたはパーシャルを検索する場合と同様に、階層およびShared
フォルダーを検索します)。
これに多くのビジネスロジックを入れることは、「懸念の分離」の原則に違反しているように感じますが、同時に非常に便利です。
__ViewStart.cshtml
_は StartPage ではなく WebPage を継承するため、そのプロパティは以前とは少し異なる場合があることに注意してください(たとえば、ViewContext
を取得してViewBag
)を取得します。
_@{
if (ViewContext.ViewBag.IsAdmin) // or other custom logic
{
Layout = "~/Views/Shared/_AdminLayout.cshtml";
}
else
{
Layout = "~/Views/Shared/_Layout.cshtml";
}
}
_
View()
メソッドには、明示的なレイアウトページを取得するオーバーロードがあります(Intellisenseはそれを「マスターページ」と呼びます)。
_ public ActionResult FooAction()
{
var model = new MyModel();
return View("Index", "_CustomLayout", model);
}
_
以下のコードを使用して、_ViewStartファイルでレイアウトのデフォルトレンダリングを変更できます。
@{
var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
string layout = "";
if (controller == "Admin")
{
layout = "~/Views/Shared/_AdminLayout.cshtml";
}
else
{
layout = "~/Views/Shared/_Layout.cshtml";
}
Layout = layout;
}