2014-02-19 6 views
22

In meinem MVC5.1 Projekt:MVC Bündelung und Minifizierung: Ich bin mit der Bündelung und minification mit CSS Umschreiben Transformation wandelt eingebettete Bilder zu URL-Pfade

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

CssRewriteUrlTransform wandelt Bildpfade relativ zum Stamm der Seite? ˅. Aber, wenn ich Bilder in CSS eingebettet:

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

diese

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

in übersetzt wird immer Und natürlich ~/Content/data:image/png;base64... existiert nicht.

Gibt es eine Möglichkeit, dies zu verhindern, außer CSS-Dateien zu aktualisieren, um eingebettete Bilder nicht zu enthalten? Oder trennen Sie sie in verschiedene CSS-Dateien, wo sie mit der tatsächlichen URL verwendet werden und diese Dateien URL-transformieren. Und noch ein CSS mit nur eingebetteten Bildern.

Antwort

13

Schrott diese Frage. Dies ist ein bekannter Fehler. Gegenwärtig ist es eine Aufgabe, Ihre CSS in eingebettete Bilder und Bilder per URL zu trennen.

Vote für diese Arbeit-Artikel: https://aspnetoptimization.codeplex.com/workitem/88 und https://aspnetoptimization.codeplex.com/workitem/108

+0

jede Abhilfe für dieses? –

+0

@innomanik funktioniert der eine unten nicht? es sieht vielversprechend aus. – trailmax

+0

Siehe meine Antwort unten mit einem Fix in einem NuGet-Paket verpackt für die schnelle Installation. – benmccallum

6

Wenn Sie nicht wollen, um die eingebetteten Bilder zu aktuellen Dateien zu extrahieren, und Sie können nicht für eine neue Version des Microsoft.AspNet.Web warten. Optimierung nuget, können Sie die folgende Klasse verwenden.

Es ist eine wörtliche Kopie von CssRewriteUrlTransform, außer es ignoriert (grob;)) URLs mit der Daten-URI-Syntax.

Gist: 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); 
    } 
} 
+0

Nice one! Senden Sie ihnen eine Pull-Anfrage, wird viel Gutes für die gesamte Community tun! – trailmax

+5

Sorry, aber es funktioniert nicht. Es konvertiert "url ('data: image" zu data: image ohne das Präfix "url (". Andererseits sollte die Exception-Logik auf RebaseUrlToAbsolute anstelle von ConvertUrlsToAbsolute ausgeführt werden. Diese andere Klasse funktioniert für mich: https: // github.com/benmccallum/AspNetBundling/blob/master/AspNetBundling/CssRewriteUrlTransformFixed.cs – Subgurim

Verwandte Themen