1

问题

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

目标

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

我的尝试

以下是我尝试过的样式表。预期的结果是两者都global.cssview_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>
4

1 回答 1

4

你不能。布局模板在您的部分之前呈现。您在部分中设置的任何变量都将设置得太晚,以至于布局无法知道它的存在。

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

于 2013-05-07T00:59:44.050 回答