问题
在 ASP.NET MVC(特别是 Razor)中,如何在部分(或“子模板”)中设置变量的值并在主(或布局)模板中访问该值?
目标
我想维护资产列表(样式表和 JavaScript 文件),并能够从部分中添加到列表中。然后,资产应该可以在主布局中访问,以包含在(样式表)中或页面(JavaScript 文件)<head/>
的末尾附近。<body/>
这提供了一种将模块存储在包含所有必要资产的部分中的优雅方法。
我的尝试
以下是我尝试过的样式表。预期的结果是两者都global.css
将view_post.css
包含在标题中,但只会global.css
显示。据我了解,这是因为布局是在模板之前呈现的。
助手/AssetHelper.cs
namespace MyApp.Helpers
{
public static class AssetHelper
{
private static SortedSet<string> StyleSheets(this HtmlHelper helper)
{
if (helper.ViewBag._styleSheets == null)
helper.ViewBag._styleSheets = new SortedSet<string> ();
return helper.ViewBag._stylesheets as SortedSet<string>;
}
public static MvcHtmlString AddStyleSheet(this HtmlHelper helper, string styleSheet) {
helper.StyleSheets().Add(styleSheet);
return new MvcHtmlString("");
}
public static MvcHtmlString RenderStyles(this HtmlHelper helper)
{
StringBuilder output = new StringBuilder();
string template = "<link rel=\"stylesheet\" type=\"text/css\" href=\"{0}\" />";
foreach (string styleSheet in helper.StyleSheets())
output.Append(String.Format(template, styleSheet));
return new MvcHtmlString(output.ToString());
}
}
}
视图/共享/Layout.cshtml
@using MyApp.Helpers
<html>
<head>
...
@Html.AddStyleSheet("global.css")
@Html.RenderStyles()
</head>
<body>
...
@RenderBody
...
</body>
</html>
视图/帖子/View.cshtml
@using MyApp.Helpers
@Html.AddStyleSheet("view_post.css")
<h2>...</h2>
<p>...</p>