我的代码库中有很多这样的副本:
@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?
答案 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包/命名空间中,基本上可以为您完成所有工作。
但如果您实际需要手动生成标记,那么它将无法运作。