【问题标题】:Relative path transformations in CSS bundlesCSS 包中的相对路径转换
【发布时间】:2015-02-06 19:08:14
【问题描述】:

我正在尝试为我的 MVC5 项目捆绑 CSS 文件,但遇到了相对 URL 的问题。在您捣碎重复问题按钮之前,我已经阅读了其他类似的问题,但答案并未涉及我需要处理的特定情况。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 记住css中的url必须用引号括起来
    猜你喜欢
    • 2022-12-01
    • 1970-01-01
    • 2015-12-02
    • 2017-08-01
    • 2011-11-07
    • 2011-05-02
    相关资源
    最近更新 更多