ASP.NET MVC4 Bundling with Twitter Bootstrap ASP.NET MVC4 Bundling with Twitter Bootstrap asp.net asp.net

ASP.NET MVC4 Bundling with Twitter Bootstrap


The issue is most likely that the icons/images in the css files are using relative paths, so if your bundle doesn't live in the same app relative path as your unbundled css files, they become broken links.

We have rebasing urls in css on our todo list, but for now, the easist thing to do is to have your bundle path look like the css directory so the relative urls just work, i.e:

new StyleBundle("~/Static/Css/bootstrap/bundle")

Update: We have added support for this in the 1.1beta1 release, so to automatically rewrite the image urls, you can add a new ItemTransform which does this rebasing automatically.

bundles.Add(new StyleBundle("~/bundles/publiccss").Include(            "~/Static/Css/bootstrap/bootstrap.css",            "~/Static/Css/bootstrap/bootstrap-padding-top.css",            "~/Static/Css/bootstrap/bootstrap-responsive.css",            "~/Static/Css/bootstrap/docs.css", new CssRewriteUrlTransform()));


The 'CssRewriteUrlTransform' works just fine for applications that DOESN'T run on top of a virtual directory.

So, if your app runs on http://your-site.com/ it runs just fine, but if runs on http://your-site.com/your-app/ you'll have 404 for all your images, because the default 'CssFixRewriteUrlTransform' is referencing your images with a '/'.

To solve this issue, i have implemented my own version of 'CssRewriteUrlTransform' like this:

    public class CssFixRewriteUrlTransform : IItemTransform {    private static string ConvertUrlsToAbsolute(string baseUrl, string content) {        if (string.IsNullOrWhiteSpace(content)) {            return content;        }        var regex = new Regex("url\\(['\"]?(?<url>[^)]+?)['\"]?\\)");        return regex.Replace(content, match => string.Concat("url(", RebaseUrlToAbsolute(baseUrl, match.Groups["url"].Value), ")"));    }    public string Process(string includedVirtualPath, string input) {        if (includedVirtualPath == null) {            throw new ArgumentNullException("includedVirtualPath");        }        var directory = VirtualPathUtility.GetDirectory(includedVirtualPath);        return ConvertUrlsToAbsolute(directory, input);    }    private 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 = string.Concat(baseUrl, "/");        }        return VirtualPathUtility.ToAbsolute(string.Concat(baseUrl, url));    }}

UPDATE: thanks to superjos who pointed that was another solution out there:

public class CssRewriteUrlTransformWrapper : IItemTransform{    public string Process(string includedVirtualPath, string input)    {                   return new CssRewriteUrlTransform().Process("~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), input);               }}


What you can do is you can go to the customize page and change @iconSpritePath and @iconWhiteSpritePath in the Sprites section and, of course, download the new style.

I've put my images in the folder Content/Images folder and I've changed the path in:

  • /Content/Images/glyphicons-halflings.png
  • /Content/Images/glyphicons-halflings-white.png

Another alternative is to download all the LESS files from github, change the same variables in the variables.less file and recompile the bootrap.less file with a tool like SimpLESS.