Ответ 1
Я нахожусь на мобильном телефоне, поэтому извиняюсь за краткий ответ, но позже я обновлю.
Короче говоря, это связано с тем, что относительный путь загрязняется после связывания. Но хорошая новость - это последняя библиотека пакетов.
Update
Чтобы заполнить пробелы, по существу, происходит то, что файлы CSS имеют относительные пути к ресурсам (в данном случае - спрайт значка). Когда в режиме отладки файлы выводятся отдельно на страницу, поэтому ссылки сохраняются (/Content/bootstrap.css
со ссылкой на images/glyphicons-halflings.png
(создание полного пути /Content/images/glyphicons-halflings.png
). Однако при отладке удаляются файлы в комплекте и путь теперь относительно любого виртуального пути, который вы дали вашему набору. В случае выше вы теперь исходите из /bundles/maincss
, который создает ошибочный путь /bundles/maincss/images/glyphicons-halflings.png
.
Хорошей новостью является то, что это была ошибка , а с Microsoft.AspNet.Web.Optimization
v1.1.0 теперь у вас CssRewriteUrlTransform
, которая заменит все относительные пути (в пределах файлы CSS) с их абсолютной версией. Это означает, что независимо от того, что вы называете связкой, ресурсы все равно будут разрешены.
Итак, чтобы исправить эту проблему, вы можете сделать следующее:
IItemTransform cssFixer = new CssRewriteUrlTransform();
bundles.Add(
new StyleBundle("~/bundles/maincss")
.Include("~/Content/bootstrap.css", cssFixer)
.Include("~/Content/bootstrap-responsive.css", cssFixer)
.Include("~/Content/my.css", cssFixer)
);
Моя единственная проблема - насколько уродливым это выглядит, когда вы хотите несколько файлов, поэтому для решения этой проблемы вы можете упростить его с помощью метода расширения:
/// <summary>
/// Includes the specified <paramref name="virtualPaths"/> within the bundle and attached the
/// <see cref="System.Web.Optimization.CssRewriteUrlTransform"/> item transformer to each item
/// automatically.
/// </summary>
/// <param name="bundle">The bundle.</param>
/// <param name="virtualPaths">The virtual paths.</param>
/// <returns>Bundle.</returns>
/// <exception cref="System.ArgumentException">Only available to StyleBundle;bundle</exception>
/// <exception cref="System.ArgumentNullException">virtualPaths;Cannot be null or empty</exception>
public static Bundle IncludeWithCssRewriteTransform(this Bundle bundle, params String[] virtualPaths)
{
if (!(bundle is StyleBundle))
{
throw new ArgumentException("Only available to StyleBundle", "bundle");
}
if (virtualPaths == null || virtualPaths.Length == 0)
{
throw new ArgumentNullException("virtualPaths", "Cannot be null or empty");
}
IItemTransform itemTransform = new CssRewriteUrlTransform();
foreach (String virtualPath in virtualPaths)
{
if (!String.IsNullOrWhiteSpace(virtualPath))
{
bundle.Include(virtualPath, itemTransform);
}
}
return bundle;
}
Это делает код более чистым. (Возможно, я выбрал длинное имя метода, но мне нравится сохранять имена методов понятными с точки зрения цели)
bundles.Add(
new StyleBundle("~/bundles/maincss").IncludeWithCssRewriteTransform(
"~/Content/bootstrap.css",
"~/Content/bootstrap-responsive.css",
"~/Content/my.css"
)
);