Объединение MVC и относительные URL-адреса CSS

Связка MVC возвращает неверный URL-адрес в изображениях CSS при использовании CssRewriteUrlTransform:

У меня есть приложение для интрасети, URL-адрес которого, например: http://usid01-srv002/MyApplication. Он находится на «Веб-сайте по умолчанию» IIS.

Который имеет следующее в BundleConfig.cs:

bundles.Add(new StyleBundle("~/bundles/jcss")
    .Include("~/Scripts/JQueryUI/css/*.css", new CssRewriteUrlTransform())
);

Система связывания генерирует неправильный URL-адрес для любых изображений, на которые есть ссылки в этих файлах CSS, что приводит к ошибкам 404 даже в очень хорошо протестированных файлах CSS JQueryUI (из FireBug):

404 ошибки из-за неправильно сгенерированного URL

например это генерирует

http://usid01/path/foo.png

Когда он должен генерироваться:

http://usid01/MyApplication/path/foo.png

Как заставить систему связывания генерировать URL-адрес, указывающий на нужное место?


person Charles Burns    schedule 10.12.2013    source источник
comment
Как вы определили свой класс CssRewriteUrlTransform?   -  person Lin    schedule 10.12.2013
comment
@лин: я этого не делал. Насколько я могу судить, вариантов у него немного: msdn.microsoft.com/en-us/library/   -  person Charles Burns    schedule 10.12.2013
comment
Вы правы, у него не так много вариантов. но если эти параметры настроены неправильно, вы не сможете получить абсолютные пути. Эта ссылка может вам помочь. aspnetoptimization.codeplex.com/workitem/83   -  person Lin    schedule 10.12.2013
comment
Что я получаю от этого: не используйте связывание CSS с путями, потому что это не работает, за исключением очень простых случаев. Гораздо проще напрямую связать минимизированный CSS.   -  person Charles Burns    schedule 13.12.2013
comment
возможный дубликат MVC4 StyleBundle, не разрешающий изображения   -  person Amirhossein Mehrvarzi    schedule 21.09.2014
comment
СМОТРИТЕ ТАКЖЕ: ответ ниже от Muhammad Waqas Iqbal ... СМОТРИТЕ ТАКЖЕ: stackoverflow.com/questions/11355935/   -  person Jonathan    schedule 04.06.2017


Ответы (3)


CssRewriteUrlTransform обновляет URL-адрес CSS с абсолютным путем, говоря об этом, если мы используем -

bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css",new CssRewriteUrlTransform()));

и у нас есть следующий класс CSS в "site.css"

.Sandy
{
    background-image: url("Images/Sandy.jpg");
    border: 1px solid #c8c8c8;
    border-radius:4px 4px 4px 4px;
    box-shadow: 1px 1px 8px gray;
    background-position:left;
    background-size:contain;
    -moz-background-size:contain;
    -webkit-background-size:contain;
    -o-background-size:contain;
    background-repeat:no-repeat;
    min-height:100px;
    min-width:100px;
    display:block;
}

и следующая структура папок -

   -Web site Root
   -Content
   --site.css
   --Images
   ---Sandy.jpg

Связка будет генерировать следующий путь URL-адреса CSS для «фонового изображения» -

 background-image: url("/Content/Images/Sandy.jpg");

И теперь, если вы размещаете веб-сайт / веб-приложение в качестве веб-сайта на веб-сервере, указанный выше путь будет работать, потому что браузер отправит запрос для этого ресурса, используя следующий URL-адрес из-за ведущего '/'

http://<server>/content/images/sandy.jpg

но если вы размещаете веб-сайт как веб-приложение, это создаст проблему. Поскольку браузер по-прежнему будет интерпретировать это как абсолютный URL-адрес, а не как относительный, и все равно отправит следующий запрос на получение этого ресурса -

   http://<server>/content/images/sandy.jpg

Таким образом, решение этой проблемы заключается в использовании относительного URL-адреса даже в файле CSS, а затем удалении CssRewriteUrlTransform из конфигурации пакета, как показано ниже:

background-image: url("Images/Sandy.jpg");

bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css"));
person Bhalchandra K    schedule 10.12.2013
comment
Без изменения CSS здесь находится еще один метод расширения, который может кому-то помочь. - person Shaiju T; 16.04.2017

Причина неработающих изображений заключается в том, что он пытается найти изображения относительно нового пути, определенного во время объединения, т.е.

bundles.Add(new StyleBundle("~/Content/woothemes").Include(
            "~/Content/woothemes/css/style.css",
));

Таким образом, если в style.css определен какой-либо путь к изображению (например, фоновое изображение), он попытается получить его путь относительно Content/woothemes вместо Content/woothemes/css/, поэтому изображения не будут найдены

Одним из способов решения проблемы для файлов одной папки является определение нового пути, такого же, как путь к папке (файлы которой минимизируются), т.е.

bundles.Add(new StyleBundle("~/Content/woothemes/css").Include(
            "~/Content/woothemes/css/style.css",
));

Таким образом, связанные файлы и фактический путь к файлам будут совпадать, и будут найдены изображения, определенные в css, поэтому проблема будет решена.

Проблема не будет решена только в том случае, если вы смешаете файлы из разных папок по той же причине, что описана выше

person Muhammad Waqas Iqbal    schedule 01.02.2016
comment
Ваш ответ, на мой взгляд, самый важный. Если вы собираетесь использовать пакет стилей, важно понимать, что ваши относительные URL-адреса css будут относиться к пакету, а последний токен в URL-адресе пакета похож на файл, а не на каталог, поэтому в приведенном выше примере ~ /Content/woothemes можно рассматривать как ~/Content/woothemes.css, что означает, что ваши URL-адреса относятся к ~/Content/ - person Jonathan; 04.06.2017

Это работает для меня,

<link href="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/content/styles/css")" rel="stylesheet" type="text/css" />
person Adrian Tarnowski    schedule 02.06.2015