Autoversioning CSS/JS in ASP.NET MVC?

Tom picture Tom · Apr 28, 2011 · Viewed 21.6k times · Source

So I was reading this stackoverflow post about "autoversioning" in ASP.NET MVC for CSS/JS files and was wondering what the "best" strategy is to do this.

The solution provided inserts an assembly number - which means everytime you publish - it will change EVERY SINGLE file which is not ideal because if you make modifications to just 1 *.css or *.js then it will change each and every file.

1) How can it be done just for "single files" instead of using site wide assembly using modification date or something on IIS7 ?

2) Also if I have some sort of "static" asset like - http://static.domain.com/js/123.js - how can I use rewrite to send the latest file for a request if someone has integrated this static link onto their site ?

i.e. http://static.domain.com/js/123.js is the link and when a request comes for this - check and send latest file ?

Answer

Rune Vejen Petersen picture Rune Vejen Petersen · Mar 2, 2013

ASP.NET 4.5+ comes with a built-in bundling & minification framework which is designed to solve this problem.

If you absolutely need a simple roll-your-own solution you can use the answer below, but I would always say the correct way is to use a bundling & minification framework.


You can modify the AssemblyInfo.cs file like so:

Change
[assembly: AssemblyVersion("1.0.0.0")]
to    
[assembly: AssemblyVersion("1.0.*")]

This means that every time the project is built, it will have a new assembly version which is higher than the previous one. Now you have your unique version number.

Create an UrlHelperExtension class that will help get this information when needed in the views:

public static class UrlHelperExtensions
{
    public static string ContentVersioned(this UrlHelper self, string contentPath)
    {
        string versionedContentPath = contentPath + "?v=" + Assembly.GetAssembly(typeof(UrlHelperExtensions)).GetName().Version.ToString();
        return self.Content(versionedContentPath);
    }
}

You can now easily add a version number to your views in the following manner:

<link href="@Url.ContentVersioned("style.css")" rel="stylesheet" type="text/css" />

When viewing your page source you will now have something that looks like

<link href="style.css?v=1.0.4809.30029" rel="stylesheet" type="text/css" />