Razor视图中构建的CSS链接

时间:2016-05-27 09:36:10

标签: css asp.net-mvc asp.net-mvc-4 razor

我的代码库中有很多这样的副本:

@if (Context.IsDebuggingEnabled)
{
    <link rel='stylesheet' href='~/Styles/FrontEnd.css' type='text/css' 
}
else
{
    <link rel='stylesheet' href='/public/css/FrontEnd-min.css' type='text/css' />
}

这让我感到恼火,所以我想把它复制成一个辅助方法,我做了:

public static MvcHtmlString IncludeDebugAwareStylesheet(this HtmlHelper htmlHelper, string debugFileName, string liveFileName)
{
    var styleSheetWrapperFormat = "<link rel='stylesheet' href='{0}' type='text/css' />";
    var debugInclude = string.Format(styleSheetWrapperFormat, debugFileName);
    var liveInclude = string.Format(styleSheetWrapperFormat, liveFileName);
    var isDebug = htmlHelper.ViewContext.HttpContext.IsDebuggingEnabled;
    return new MvcHtmlString(isDebug ? debugInclude : liveInclude );
}

但现在CSS文件无法识别。 据我所知,在原文中,~已被删除,但在我的新代码中,它不是?

这是为什么?我是否需要告诉Razor以某种方式“处理”URL?

2 个答案:

答案 0 :(得分:2)

您需要使用UrlHelper.GenerateContentUrl来解决与项目相关的引用。

尝试:

public static MvcHtmlString IncludeDebugAwareStylesheet(this HtmlHelper htmlHelper, string debugFileName, string liveFileName)
{
    var styleSheetWrapperFormat = "<link rel='stylesheet' href='{0}' type='text/css' />";
    var debugInclude = string.Format(styleSheetWrapperFormat, UrlHelper.GenerateContentUrl(debugFileName, htmlHelper.ViewContext.HttpContext));
    var liveInclude = string.Format(styleSheetWrapperFormat, UrlHelper.GenerateContentUrl(liveFileName, htmlHelper.ViewContext.HttpContext));
    var isDebug = htmlHelper.ViewContext.HttpContext.IsDebuggingEnabled;
    return new MvcHtmlString(isDebug ? debugInclude : liveInclude );
}

这是因为~表示&#34;项目根&#34;在ASP.Net/MVC中。在你的.cshtml文件中,Razor视图引擎会自动将这些引用编译成正确的相对URL,但是你的HtmlHelper扩展目前只是将字符串放入原样,而不是先解析引用。

答案 1 :(得分:0)

我遇到的另一个解决方案,它没有回答这个字面问题,但对我的方案来说是更好的解决方案。

使用Styles.Render(fileName) 它位于System.Web.Optimisations Nuget包/命名空间中,基本上可以为您完成所有工作。

但如果您实际需要手动生成标记,那么它将无法运作。