如何仅在 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>
我有一种样式 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>