CSS包中的相对路径转换

时间:2014-12-09 00:45:26

标签: c# css asp.net-mvc asp.net-mvc-5

我正在尝试捆绑我的MVC5项目的CSS文件,而且我遇到了相对网址的问题。在您复制重复的问题按钮之前,我已经阅读了其他类似的问题,答案还没有解决我需要处理的特定情况。

我正在处理的项目将作为常规IIS站点下的应用程序运行,这意味着它不会位于域的根目录下。当使用开箱即用的URL转换CssRewriteUrlTransform()时,这是一个问题,因为它(愚蠢地,在我看来)并没有考虑URL中的应用程序名称,而是生成绝对值将域根作为起始级别的路径。假设我有以下文件夹结构:

site
'--- content
     |--- css
     |    '--- style.css
     '--- images
          '--- logo.png

如果我使用这样的相对网址:

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对象列表似乎将它们视为FileInfo个对象,因此正在调用不存在的属性。

1 个答案:

答案 0 :(得分:7)

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()));