如何仅在 ASP.NET MVC 中的某个区域的页面上包含样式 sheet?

How to include style sheet only on pages in a certain Area in ASP.NET MVC?

我有一种样式 sheet,我只想将其包含在属于 MVC 中特定区域的网页中。

我知道,默认情况下,您会得到 Areas/<Area Name>/Views/_ViewStart.cshtml,但我想要为该区域呈现默认布局。我的区域的 _ViewStart 文件如下所示:

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

我尝试在我的区域的 _ViewStart 文件中添加对 Styles.Render("My Bundle Name") 的调用,但 <link> 标记未显示在 HTML 源中。

我什至创建了一个 HtmlHelper 扩展方法,returns 来自路由的 MVC 中当前区域的名称,并包括样式 sheet 这样:

@if (Html.AreaName() == "MyArea")
{
    @Styles.Render("...")
}

AreaName() 扩展方法的代码:

public static string AreaName<TModel>(this HtmlHelper<TModel> htmlHelper)
{
    return htmlHelper.ViewContext.RouteData.Values["area"] as string;
}

但这总是returns null。我什至调试了应用程序并浏览了 "Locals" 调试器选项卡。路由数据包含控制器、id 和操作名称,但不包含区域名称,即使它在我的区域中呈现页面。

背景

我正在为这个领域创建一个 NuGet 包,它可以安装在任何 MVC 应用程序上。在我们的组织中,我们得到了基于 Bootstrap 的基本 HTML 和 CSS 布局,因此布局具有一定的可预测性,但我想对冲我的赌注,只导入样式特定于从该区域呈现的页面上的我的区域。

如何在 MVC 的某个 Area 中的页面中包含一种样式 sheet,该样式在其他 Areas 或没有 Area 的页面中不显示?

你应该从DataTokens

中读取区域名称

这应该有效。

public static string AreaName<TModel>(this HtmlHelper<TModel> htmlHelper)
{
    return htmlHelper.ViewContext.RouteData.DataTokens["area"] as string;
}

这不是一个优雅的解决方案,但您可以在 ViewStart 中设置一个 PageData 值,然后在主 Layout 页面中检查它:

_ViewStart.cshtml 适合您所在地区

@{
   Layout = "~/Views/Shared/_Layout.cshtml";
   PageData["AdditionalStyleBundle"] = "~/Content/myCSSBundle";
}

_Layout.cshtml

<head>
    @if (PageData.ContainsKey("AdditionalStyleBundle"))
    {
       @Styles.Render(PageData["AdditionalStyleBundle"]);
    }
</head>