Мой вопрос похож на это:
За исключением того, что я хочу придерживаться собственной комплектации MVC, если смогу. У меня происходит сбой мозга, когда я пытаюсь выяснить, каков правильный шаблон для определения наборов стилей, таких как автономные наборы css и изображений, такие как jQuery UI.
У меня есть типичная структура сайта MVC, с /Content/css/
которой содержит мои основные CSS, такие как styles.css
. В этой папке CSS у меня также есть подпапки, такие как, /jquery-ui
который содержит его файл CSS плюс /images
папку. Пути к изображениям в jQuery UI CSS относятся к этой папке, и я не хочу с ними связываться.
Насколько я понимаю, когда я указываю, StyleBundle
мне нужно указать виртуальный путь, который также не совпадает с реальным путем к контенту, потому что (при условии, что я игнорирую маршруты к контенту) IIS затем попытается разрешить этот путь как физический файл. Итак, я уточняю:
bundles.Add(new StyleBundle("~/Content/styles/jquery-ui")
.Include("~/Content/css/jquery-ui/*.css"));
отображается с использованием:
@Styles.Render("~/Content/styles/jquery-ui")
Я вижу, что запрос идет к:
http://localhost/MySite/Content/styles/jquery-ui?v=nL_6HPFtzoqrts9nwrtjq0VQFYnhMjY5EopXsK8cxmg1
Это возвращает правильный минимизированный ответ CSS. Но затем браузер отправляет запрос на относительно связанное изображение в виде:
http://localhost/MySite/Content/styles/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
Который является 404
.
Я понимаю, что последняя часть моего URL-адреса jquery-ui
- это URL- адрес без расширения, обработчик для моего пакета, поэтому я могу понять, почему относительный запрос изображения просто /styles/images/
.
Поэтому мой вопрос: как правильно справиться с этой ситуацией?
Ответы:
Согласно этой теме о связывании css MVC4 и ссылках на изображения , если вы определите свой комплект как:
Если вы определяете пакет по тому же пути, что и исходные файлы, которые составляли пакет, относительные пути к изображениям все равно будут работать. Последняя часть пути к пакету действительно предназначена
file name
для этого конкретного пакета (т. Е./bundle
Может быть любым именем, которое вам нравится).Это будет работать, только если вы объединяете CSS из одной и той же папки (что, я думаю, имеет смысл с точки зрения объединения).
Обновить
Согласно комментарию ниже @Hao Kung, в качестве альтернативы теперь это может быть достигнуто путем применения
CssRewriteUrlTransformation
( Изменить относительные URL-ссылки на CSS-файлы в комплекте ).ПРИМЕЧАНИЕ. Я не подтвердил комментарии относительно проблем с перезаписью абсолютных путей в виртуальном каталоге, поэтому это может не сработать для всех (?).
источник
Решение Grinn / ThePirat работает хорошо.
Мне не понравилось, что он new'd метод Include в комплекте и что он создает временные файлы в каталоге содержимого. (они закончили тем, что зарегистрировались, развернули, тогда служба не запустилась!)
Таким образом, чтобы следовать схеме Bundling, я решил выполнить по существу тот же код, но в реализации IBundleTransform:
А затем обернул это в реализацию Bundle:
Пример использования:
Вот мой метод расширения для RelativeFromAbsolutePath:
источник
relativeToCSS
перед вызовомPath.GetFullPath()
.Еще лучше (IMHO) реализовать собственный Bundle, который исправляет пути к изображениям. Я написал один для моего приложения.
...
Чтобы использовать это, сделайте:
...вместо того...
Что он делает (когда не в режиме отладки) ищет
url(<something>)
и заменяет егоurl(<absolute\path\to\something>)
. Я написал эту штуку около 10 секунд назад, так что, возможно, потребуется немного изменить ее. Я учел полностью определенные URL-адреса и BaseUR DataURI, убедившись, что в пути URL нет двоеточий (:). В нашей среде изображения обычно находятся в той же папке, что и их CSS-файлы, но я проверил это как с родительскими папками (url(../someFile.png)
), так и с дочерними папками (url(someFolder/someFile.png
).источник
Нет необходимости указывать преобразование или иметь сумасшедшие пути подкаталогов. После долгих проблем я изолировал это «простое» правило (это ошибка?) ...
Если путь вашего комплекта не начинается с относительного корня включаемых элементов, то корень веб-приложения не будет учитываться.
Это звучит как большая ошибка для меня, но в любом случае это то, как вы исправите это в текущей версии .NET 4.51. Возможно, другие ответы были необходимы в более старых сборках ASP.NET, нельзя сказать, что у меня нет времени на ретроспективное тестирование всего этого.
Чтобы уточнить, вот пример:
У меня есть эти файлы ...
Затем настройте пакет как ...
И сделать это как ...
И получите «поведение» (ошибка), у самих CSS-файлов есть корень приложения (например, «http: // localhost: 1234 / MySite / Content / Site.css»), но изображение CSS внутри всего запуска »/ Content / Images / ... "или" / Images / ... "в зависимости от того, добавляю я преобразование или нет.
Даже попытался создать папку «Связки», чтобы увидеть, связано ли это с существующим путем или нет, но это ничего не изменило. Решение проблемы на самом деле заключается в том, что имя пакета должно начинаться с корня пути.
Значение этого примера исправлено путем регистрации и рендеринга пути пакета, как ..
Конечно, вы можете сказать, что это RTFM, но я вполне уверен, что я и другие взяли этот путь "~ / Bundles / ..." из шаблона по умолчанию или где-то в документации на веб-сайте MSDN или ASP.NET, или просто наткнулся на него, потому что на самом деле это вполне логичное имя для виртуального пути и имеет смысл выбирать такие виртуальные пути, которые не конфликтуют с реальными каталогами.
Во всяком случае, так оно и есть. Microsoft не видит ошибки. Я не согласен с этим: либо он должен работать должным образом, либо должно быть выдано какое-то исключение, либо добавлено дополнительное переопределение для добавления пути к пакету, который выбирает включить корень приложения или нет. Я не могу себе представить, почему кто-то не хотел бы, чтобы корень приложения был включен, когда он был (обычно, если вы не установили свой веб-сайт с псевдонимом DNS / корнем веб-сайта по умолчанию). Так что на самом деле это должно быть по умолчанию в любом случае.
источник
Я обнаружил, что CssRewriteUrlTransform не запускается, если вы ссылаетесь на
*.css
файл и у вас есть связанный*.min.css
файл в той же папке.Чтобы это исправить, либо удалите
*.min.css
файл , либо сделайте ссылку на него прямо в вашем комплекте:После этого ваши URL-адреса будут преобразованы правильно, и ваши изображения должны быть правильно разрешены.
источник
Может быть, я предвзят, но мне очень нравится мое решение, так как оно не выполняет никаких преобразований, регулярных выражений и т. Д., И в нем меньше всего кода :)
Это работает для сайта, размещенного в качестве виртуального каталога на веб-сайте IIS и корневого веб-сайта в IIS.
Поэтому я создал Implentation
IItemTransform
инкапсулированногоCssRewriteUrlTransform
и использовалVirtualPathUtility
для исправления пути и вызова существующего кода:Кажется, работает нормально для меня?
источник
Хотя ответ Криса Бакстера помогает с оригинальной проблемой, он не работает в моем случае, когда приложение размещено в виртуальном каталоге . Изучив варианты, я закончил с DIY решением.
ProperStyleBundle
Класс включает в себя код, заимствованный из оригинала,CssRewriteUrlTransform
для правильного преобразования относительных путей в виртуальном каталоге. Он также выдает, если файл не существует, и предотвращает изменение порядка файлов в комплекте (код взят изBetterStyleBundle
).Используйте это как
StyleBundle
:источник
Начиная с версии 1.1.0-alpha1 (предварительная версия пакета) платформа использует
VirtualPathProvider
для доступа к файлам, а не касается физической файловой системы.Обновленный трансформатор можно увидеть ниже:
источник
Вот преобразование Bundle, которое заменит URL CSS на URL относительно этого файла CSS. Просто добавьте его в ваш пакет, и это должно решить проблему.
источник
cannot convert type from BundleFile to FileInfo
Другой вариант - использовать модуль перезаписи URL IIS для сопоставления папки образа виртуального пакета с папкой физического образа. Ниже приведен пример правила перезаписи, которое вы можете использовать для пакета под названием «~ / bundles / yourpage / styles» - обратите внимание на совпадения регулярных выражений для буквенно-цифровых символов, а также дефисов, подчеркиваний и точек, которые часто встречаются в именах файлов изображений ,
Этот подход создает немного дополнительных затрат, но позволяет вам лучше контролировать имена ваших пакетов, а также уменьшает количество пакетов, на которые вы можете ссылаться на одной странице. Конечно, если вам нужно ссылаться на несколько сторонних CSS-файлов, которые содержат относительные ссылки на пути к изображениям, вы все равно не сможете обойтись без создания нескольких пакетов.
источник
Гринн отлично подходит.
Однако это не работает для меня, когда в URL есть относительные ссылки родительской папки. т.е.
url('../../images/car.png')
Итак, я немного изменил
Include
метод, чтобы разрешить пути для каждого соответствия регулярному выражению, позволяя относительные пути, а также, возможно, вставлять изображения в CSS.Я также изменил IF DEBUG, чтобы проверить
BundleTable.EnableOptimizations
вместоHttpContext.Current.IsDebuggingEnabled
.Надеюсь, что это помогает, привет.
источник
Вы можете просто добавить еще один уровень глубины к своему пути виртуального пакета
Это супер лёгкий ответ и своего рода хак, но он работает и не требует предварительной обработки. Учитывая длину и сложность некоторых из этих ответов, я предпочитаю делать это таким образом.
источник
У меня была эта проблема с пакетами, имеющими неправильные пути к изображениям и
CssRewriteUrlTransform
не разрешающими относительные родительские пути..
правильно (была также проблема с внешними ресурсами, такими как веб-шрифты). Вот почему я написал это пользовательское преобразование (похоже, все делает правильно):Редактировать: я не понял этого, но я использовал несколько пользовательских методов расширения в коде. Исходный код этих:
Конечно, это должно быть возможно заменить
String.StartsWith(char)
наString.StartsWith(string)
.источник
m.Groups[2].Value.Count("..")
не работает). ИValue.StartsWith('/')
не работает, потому что StartsWith ожидает строку вместо символа.После небольшого расследования я пришел к выводу следующее: у вас есть 2 варианта:
идти с преобразованиями. Очень полезный пакет для этого: https://bundletransformer.codeplex.com/ вам необходимо выполнить следующее преобразование для каждого проблемного пакета:
Преимущества: этого решения вы можете назвать свой пакет как хотите => вы можете объединить CSS-файлы в один пакет из разных каталогов. Недостатки: вам нужно преобразовать каждый проблемный пакет
источник
CssRewriteUrlTransform
исправил мою проблему.Если ваш код по-прежнему не загружает изображения после использования
CssRewriteUrlTransform
, измените имя файла CSS:Для того, чтобы:
Так или иначе. (Точки) не распознаются в URL.
источник
Просто не забудьте исправить несколько включений CSS в комплекте, таких как:
Вы не можете просто добавить
new CssRewriteUrlTransform()
в конец, как вы можете с одним файлом CSS, так как метод не поддерживает его, поэтому вы должны использоватьInclude
несколько раз :источник