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

时间:2016-09-28 18:48:18

标签: c# asp.net asp.net-mvc asp.net-mvc-areas

我有一个样式表,我只想包含在MVC中特定区域的一部分的网页上。

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

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

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

我甚至创建了一个HtmlHelper扩展方法,该方法从Route返回MVC中当前Area的名称,并包含样式表:

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

AreaName()扩展方法的代码:

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

但是这总是返回null。我甚至调试了应用程序,并在“Locals”调试器选项卡周围进行了调试。路径数据包含控制器,id和操作名称,但不包括区域名称,即使它在我的区域中呈现页面。

背景

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

如何在MVC的某个区域中包含样式表,哪些区域不显示在其他区域中,或者没有区域的页面?

2 个答案:

答案 0 :(得分:1)

您应该从Firefox version 41.0

中读取区域名称

这应该有用。

DataTokens

答案 1 :(得分:1)

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

您所在地区的

_ViewStart.cshtml

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

<强> _Layout.cshtml

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