2014-02-19 1 views
22

В моем MVC5.1 проекте я использую пакетирование и Минимизацию с CSS переписывания трансформацией:MVC Пакетирование и Минимизация: преобразует встроенные изображения в URL в пути

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 с только встроенными изображениями.

ответ

13

лом этот вопрос. Это известная ошибка. В настоящее время мы работаем над тем, чтобы разделить ваш CSS на встроенные изображения и изображения с помощью URL.

Голосуйте за эти работы-элементы: https://aspnetoptimization.codeplex.com/workitem/88 и https://aspnetoptimization.codeplex.com/workitem/108

+0

любого обходного пути к этому? –

+0

@innomanik делает ниже, не работает? это выглядит многообещающим. – trailmax

+0

См. Мой ответ ниже с исправлением, завернутым в пакет NuGet для быстрой установки. – benmccallum

6

Если вы не хотите, чтобы извлечь внедренные изображения на реальные файлы и вы не можете ждать новую версию Microsoft.AspNet.Web. Оптимизация nuget, вы можете использовать следующий класс.

Это стенографическая копия CssRewriteUrlTransform, за исключением того, что она игнорирует (грубо;)) URL-адрес с синтаксисом URI данных.

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

Ницца! Отправьте им запрос на тяну, сделайте много хорошего для всего сообщества! – trailmax

+5

Извините, но это не сработает. Он преобразует «url (« данные: изображение »в данные: изображение без префикса« url ». С другой стороны, логика исключения должна выполняться в RebaseUrlToAbsolute вместо ConvertUrlsToAbsolute. Этот другой класс работает для меня: https: // github.com/benmccallum/AspNetBundling/blob/master/AspNetBundling/CssRewriteUrlTransformFixed.cs – Subgurim

5

заказ мой обходной путь, который я 'в комплекте' красиво в пакет NuGet. https://github.com/benmccallum/AspNetBundling

В противном случае просто обновить хрюкать/глотку;)

+0

grunt/gulp не всегда вариант, но хорошее предложение. – trailmax

+0

Следовательно;;) haha – benmccallum

 Смежные вопросы

  • Нет связанных вопросов^_^