我正在尝试为我的 MVC5 元素捆绑 CSS 文件,但我遇到了与相对 URL 相关的问题。在您按下重复问题按钮之前,我已经阅读了其他类似的问题,但答案并未涉及我需要处理的特定情况。
我正在处理的元素将作为常规 IIS 站点下的应用程序运行,这意味着它不会位于域的根目录下。这是使用开箱即用的 URL 转换 CssRewriteUrlTransform()
时的一个问题,因为它(愚蠢的,以我的拙见)没有考虑 URL 中的应用程序名称,而是它生成将域根作为起始级别的绝对路径。假设我有以下文件夹结构:
site
'--- content
|--- css
| '--- style.css
'--- images
'--- logo.png
如果我使用这样的相对 URL:
background-image: url('../images/logo.png');
它被转换为:
background-image: url('http://domainname.com/content/images/logo.png');
问题是,我需要它在进行转换时尊重应用程序/子目录名称。该解决方案还应保留查询字符串。
background-image: url('http://domainname.com/applicationname/content/images/logo.png[?querystring]
我找到的最接近的是 AcidPAT 就这个问题提供的解决方案:MVC4 StyleBundle not resolving images
但该解决方案无法为我编译,因为它似乎将 response.Files
视为 IEnumerable,而实际上它是 IEnumerable - 也许这已从 MVC4 更改为 MVC5。
总结
我需要一种在捆绑时自动将 CSS 中的相对路径转换为绝对路径的方法。该解决方案需要了解应用程序的实际 位置,因此如果应用程序安装在域的子目录下,它应该可以工作。该解决方案还需要保留来自相对 URL 的任何查询字符串。
谁能就此提供一些指导?
最接近的解决方案是这个要点:https://gist.github.com/dotnetchris/3d1e4fe9b0fa77eefc82唯一的问题是它似乎与 MVC5 不兼容。具体来说,从第 12 行开始遍历 BundleFile
对象列表的 block 似乎将它们视为 FileInfo
对象,因此正在调用不存在的属性.
最佳答案
I believe this could be a bug with CssRewriteUrlTransform .它将解析主机而不是虚拟目录。这就是我使用的。它只是一个允许捆绑过程正确解析的包装器类。
public class CssRewriteUrlTransformWrapper : IItemTransform
{
public string Process(string includedVirtualPath, string input)
{
return new CssRewriteUrlTransform().Process("~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), input);
}
}
用法...
bundles.Add(new StyleBundle("~/Content/css")
.Include("~/Content/Site.css", new CssRewriteUrlTransformWrapper()));
关于c# - CSS 包中的相对路径转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27369664/