web-dev-qa-db-ja.com

ASP.NET MVCのビューのレイアウト(マスターページ)を再作成せずに変更する

RazorビューでASP.NET MVC 3を使用しています。ビューを作成する場合は、ビューのレイアウト(マスターページ)を選択するか、デフォルトのまま(_Layout)を選択します。

再作成せずにビューを作成した後にこのレイアウトを変更するのは興味深いですが、ビューに関するレイアウト情報を保存する場所はありますか?そして、どうすれば変更できますか?

43
Saeid

MVC3には、すべてのページのレイアウトを格納する_ViewStart.cshtmlがあります。この要素を変更してすべてのページのレイアウトを変更するか、次のように@{}ブロックのターゲットビューページの上部に新しいレイアウト要素を追加して、特定のページのレイアウトを変更できます。

@{
    Layout = "~/Views/Shared/_newLayout.cshtml";
    ViewBag.Title = "Index";
}
68
Saeid

Cshtmlファイルの上部にビューを作成すると、レイアウトが含まれていることがわかります。

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

たとえば、それを別のレイアウトに簡単に置き換えることができます

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

また、これを基本レイアウト(_ViewStart.cshtml)そして、すべてのビューがそのレイアウトを使用します。

21
Chuck Norris

ビューに異なるレイアウトを指定するには、ニーズに応じて複数の方法があります。

ビューで

他の回答で述べたように、ビューのLayoutプロパティを変更するだけです:

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

_ViewStart.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);
    }
_
19
Toby J

以下のコードを使用して、_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;
}
7
Jithesh Chandra