ASP.NET MVC-从分部或正文设置布局模板中的变量
本文关键字:布局 变量 设置 正文 MVC- NET ASP | 更新日期: 2023-09-27 18:12:18
问题
在ASP.NET MVC(特别是Razor(中,如何在分部(或"子模板"(中设置变量的值,并在主模板(或布局(中访问该值?
目标
我想维护资产列表(样式表和JavaScript文件(,并能够从部分中添加到列表中。然后,资产应该可以在主布局中访问,以包括在页面的<head/>
(样式表(或<body/>
(JavaScript文件(的末尾附近。这提供了一种优雅的方式,可以将模块存储在包括所有必要资产的部分中。
我的尝试
以下是我为样式表所做的尝试。预期的结果是global.css
和view_post.css
都将被包括在报头中,但只有global.css
出现。据我所知,之所以会出现这种情况,是因为布局是在模板之前呈现的。
Helpers/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());
}
}
}
视图/Shared/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>
你不能。布局模板在您的部分之前进行渲染。在分部中设置的任何变量都会设置得太晚,布局无法知道它在那里。
这似乎是一个过于复杂的解决方案。为什么不直接使用MVC提供的WebOptimization工具呢?