9

与えられたビュー階層: Index.cshtml -> _Layout.cshtml -> _MasterLayout.cshtml :

_MasterLayout.cshtml - マスター レイアウトで使用するセクションのセット (以下)

@section javascriptLinks {
<script src="~/client/vendor/require-jquery.js" data-main="~/client/main.js" type="text/javascript"></script>
}
@RenderBody()

_Layout.cshtml - 実際のサイト マスター レイアウト

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

<!doctype html>
<html>
<!-- actual site layout here -->
<body>
@RenderBody()
@RenderSection("javascriptLinks")
</body>
</html>

Index.cshtml - 具体的なページ固有のマークアップ

_Layout.cshtml と _MasterLayout.cshtml を分割するという考え方は、コード共有です。私は一種のライブラリ/フレームワークを持っており、_MasterLayout はこのライブラリに属しています。_Layout.cshtml は具体的なアプリケーション サイト マスター レイアウトです。

残念ながら、このスキーマは機能しません。レンダリング中、_Layout.cshtml は _MasterLayout.cshtml のセクションを認識しません。

そのような場合にセクションを使用する方法はありますか (子ビューからではなく、親ビューから取得します)?

考えられる解決策の 1 つは、_MasterLayout.cshtml でセクションごとに個別のページを作成し、_Layout で @RenderPage を呼び出すことです。しかし、単一の共有アセット (_MasterLayout.cshtml) が必要です。

4

1 に答える 1

5

操作を逆にしてみてください。私はこのように意味します:

あなたの_MasterLayout.cshtml:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    @RenderSection("HeadSection", true)
    <title>@ViewBag.Title</title>
</head>
<body>
@RenderBody()

// ...... 
// You could put your general scripts here
<script src="~/client/vendor/require-jquery.js" data-main="~/client/main.js" type="text/javascript"></script>
// Put true to enforce the sub layout to define Scripts section
    @RenderSection("Scripts", true)
</body>
</html>

あなたの_Layout.cshtml:

@{ Layout = "~/Views/_Shared/_LayoutMain.cshtml"; }
@section HeadSection{
    // any thing you want
    @RenderSection("HeadSection", false)
}
    @RenderBody()
// ...... 
// Put false to make Scripts section optional
@section Scripts{
    @RenderSection("Scripts", false)
}
于 2012-05-05T12:00:48.540 に答える