c# - CSS 包中的相对路径转换

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

我正在尝试为我的 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/

相关文章:

c# - 如何在 Unity AndroidJavaClass 中访问枚举

c# - 如何在 C# .Net 3.5 SP1 中显示身份验证对话框

html - 使用 Bootstrap 固定导航栏

用于动态创建元素的 jQuery CSS()

asp.net-mvc - 为什么 Razer 在以下示例中不起作用?

c# - 需要nHibernate指南来做CRUD

c# - 如何理解以下实现算法的 C# linq 代码以返回 n 中 k 元素的所有组合

c# - 基于不同因素的随机数生成

jquery - 谷歌地图地理编码 longlat

html - 如何使表格边框在新 ASP.Net MVC 3 应用程序的标题部分不可见?