ASP.NET MVCのネストされたレイアウトページ

3217 ワード

WEBフォームモードでは、マスターページを使い慣れており、マスターページがネストされている場合がよくあります.
MVCモードでは、マスターページに対応するものをレイアウトページと呼ぶ.デフォルトのレイアウトページは~/Views/Shared/_です.Layout.cshtml.~/Views/_にあるため、デフォルトでは各ページが埋め込まれます.ViewStart.cshtmlには次のように書かれています.
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
もちろん、これは変更できるはずですが、一般的には必要ありません.私のやり方は、Layout.cshtmlは基本マスターページとして用いられ,その後,各シードマスターページが派生する.以下、それぞれ_Layout.cshtmlとサブレイアウトページ(_SingleContent_Layout.cshtml)のコード:
_Layout.cshtml
@using common = www.AppCode.Common;
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@common.GetTitle(ViewBag.IndependentTitle,ViewBag.Title)</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
	<!--      head   。        ContentPlaceHolder -->
    @RenderSection("header", required: false)
</head>
<body>
    <div>
        <div id="ly_Top" class="ly_960">
            <div id="ly_User">
				<!--     。        -->
                @{Html.RenderAction("LoginInfo", "Partial");}
            </div>
            <div id="ly_Web">
            </div>
        </div>

        <div id="ly_NaviContainer">
            <div id="ly_Navi">
                <div class="ly_960">
                    <div id="ly_Logo" onclick="location.href='/'"></div>
                    <div>
						<!--    。        -->
                        @{Html.RenderAction("Navi"
                              , "Partial"
                              , new { parentController = ViewContext.RouteData.Values["controller"].ToString() });}
                    </div>
                </div>
            </div>
        </div>

        <div id="ly_Main">
			<!--       -->
			@RenderBody()
        </div>
   </div>

    @Scripts.Render("~/bundles/jquery182")
	<!--             。        ContentPlaceHolder -->
    @RenderSection("scripts", required: false)
</body>
</html>
サブマスターページ_SingleContent_Layout.cshtml
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section header{
    @Styles.Render("~/Content/SingleContent")
	@*                  ,    ?                 *@
    @RenderSection("header", required: false)
}
@section Scripts {
    @RenderSection("scripts", required: false)
}
<div class="content_box container">
    <div class="content_box_in">
        @RenderBody()
    </div>
</div>
コンテンツページindex.cshtml
@{
    ViewBag.Title = "Service";
    Layout = "~/Views/Shared/_SingleContent_Layout.cshtml";
}

<div class="service">
    <h2>    </h2>
</div>	
参考記事:
http://www.cnblogs.com/haiyabtx/archive/2012/06/12/2545821.html