ASP.NET MVC-从分部或正文设置布局模板中的变量

本文关键字:布局 变量 设置 正文 MVC- NET ASP | 更新日期: 2023-09-27 18:12:18

问题

在ASP.NET MVC(特别是Razor(中,如何在分部(或"子模板"(中设置变量的值,并在主模板(或布局(中访问该值?

目标

我想维护资产列表(样式表和JavaScript文件(,并能够从部分中添加到列表中。然后,资产应该可以在主布局中访问,以包括在页面的<head/>(样式表(或<body/>(JavaScript文件(的末尾附近。这提供了一种优雅的方式,可以将模块存储在包括所有必要资产的部分中。

我的尝试

以下是我为样式表所做的尝试。预期的结果是global.cssview_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>

ASP.NET MVC-从分部或正文设置布局模板中的变量

你不能。布局模板在您的部分之前进行渲染。在分部中设置的任何变量都会设置得太晚,布局无法知道它在那里。

这似乎是一个过于复杂的解决方案。为什么不直接使用MVC提供的WebOptimization工具呢?