27

在我的 MVC5.1 项目中,我使用捆绑和缩小与 CSS 重写转换:

styleBundle.Include("~/Content/Site.css", new CssRewriteUrlTransform());
bundles.Add(styleBundle);

CssRewriteUrlTransform转换相对于站点根目录的图像路径。但是,当我将图像嵌入到 css 中时:

span.file {
  background-image: url(data:image/png;base64,iVBORw0KGg+...2AAAAElFTkSuQmCC);
}

这被翻译成

span.file {
  background-image: url(http://localhost:52253/Content/data:image/png;base64,iVBORg...mCC);
}

而且显然~/Content/data:image/png;base64...不存在。

除了更新 CSS 文件以不包含嵌入图像之外,还有什么方法可以阻止这种情况的发生?或者分离成不同的 CSS 文件,使用实际的 URL 并对这些文件进行 URL 转换。另一个只有嵌入图像的 CSS。

4

4 回答 4

13

放弃这个问题。这是一个已知的错误。目前的解决方法是通过 url 将您的 css 分离为嵌入的图像和图像。

为这些工作项投票:https ://aspnetoptimization.codeplex.com/workitem/88和https://aspnetoptimization.codeplex.com/workitem/108

于 2014-02-19T11:19:08.790 回答
8

查看我已经很好地“捆绑”到 NuGet 包中的解决方法。https://github.com/benmccallum/AspNetBundling

否则只需升级到 grunt/gulp ;)

于 2015-03-13T12:35:36.220 回答
6

如果您不想将嵌入的图像提取到实际文件中并且等不及 Microsoft.AspNet.Web.Optimization nuget 的新版本,则可以使用以下类。

它是 CssRewriteUrlTransform 的逐字副本,但它忽略了(粗略地;))具有数据 URI 语法的 URL。

要点:https ://gist.github.com/janv8000/fa69b2ab6886f635e3df

/// <remarks>Part of Microsoft.AspNet.Web.Optimization.1.1.3, forked to ignore data-uri</remarks>
public class CssRewriteUrlTransformIgnoringDataUri : IItemTransform
{
    internal static string RebaseUrlToAbsolute(string baseUrl, string url)
    {
        if (string.IsNullOrWhiteSpace(url) || string.IsNullOrWhiteSpace(baseUrl) || url.StartsWith("/", StringComparison.OrdinalIgnoreCase))
            return url;
        if (!baseUrl.EndsWith("/", StringComparison.OrdinalIgnoreCase))
            baseUrl = baseUrl + "/";
        return VirtualPathUtility.ToAbsolute(baseUrl + url);
    }

    internal static string ConvertUrlsToAbsolute(string baseUrl, string content)
    {
        if (string.IsNullOrWhiteSpace(content))
        { return content; }

        return new Regex("url\\(['\"]?(?<url>[^)]+?)['\"]?\\)").Replace(content, match =>
        {
            var format = match.Groups["url"].Value;
            if (format.StartsWith("data:image", StringComparison.CurrentCultureIgnoreCase))
            {
                return format;
            }

            return "url(" + RebaseUrlToAbsolute(baseUrl, format) + ")";
        });
    }

    public string Process(string includedVirtualPath, string input)
    {
        if (includedVirtualPath == null)
        {
            throw new ArgumentNullException("includedVirtualPath");
        }
        return ConvertUrlsToAbsolute(VirtualPathUtility.GetDirectory(includedVirtualPath.Substring(1)), input);
    }
}
于 2014-07-11T13:44:32.780 回答
0

对于带有角度项目的 asp.net mvc,我们面临同样的问题。问题是针对未在 prod 环境中显示的 ag-grid base 64 图像。

作为一种解决方法,我们删除了 CssRewriteUrlTransform() 并更改了虚拟路径以匹配实际物理路径。

Old code
bundles.Add(new StyleBundle("~/bundles/styles").Include("~/Content/Site.css", new CssRewriteUrlTransform());

New code change
bundles.Add(new StyleBundle("~/dist/styles").Include("~/Content/Site.css");

最初 base64 图像正在寻找不存在的 bundles 文件夹。

Old
background: transparent url(data:image/svg+xml;base64,PHN2ZyB3a...)

被翻译成

background: transparent url(/dist/data:image/svg+xml;base64,PHN2ZyB3a...)

进行上述更改后,base 64 图像未附加任何路径。

于 2019-01-09T09:03:05.193 回答