Publié lundi 4 mars 2013 22:58 par Groc

[ASP.NET MVC] Définir ses bundles dans le web.config

Il n’existe pas de solutions directement dans ASP.NET MVC pour nous permettre de déclarer nos bundles directement dans le fichier web.config.

Pour palier à ce manque, j’ai écris une custom section qui me permet de déclarer mes bundles et de les charger au lancement de mon application Smile

D’abord donc, mon arborescence de configuration désirée :

<bundle enableOptimizations="true"> <bundles> <add type="Script" name="~/bundles/jquery"> <includes> <add path="~/Scripts/jquery-{version}" /> </includes> </add> <add type="Style" name="~/Content/css"> <includes> <add path="~/Content/site.css" /> </includes> </add> </bundles> </bundle>

La déclaration de ma section :

<section name="bundle" type="BundleExtensions.BundleSection, BundleExtensions" />

La partie la plus barbante, c’est donc la création du modèle correspondant à la section custom …

public sealed class BundleSection : ConfigurationSection { [ConfigurationProperty("enableOptimizations", DefaultValue = true, IsRequired = false)] public bool EnableOptimizations { get { return (bool)this["enableOptimizations"]; } set { this["enableOptimizations"] = value; } } [ConfigurationProperty("bundles", IsRequired = true)] public BundleConfigurationCollection Bundles { get { return this["bundles"] as BundleConfigurationCollection; } set { this["bundles"] = value; } } } public sealed class BundleConfigurationItem : ConfigurationElement { [ConfigurationProperty("type")] public BundleType Type { get { return (BundleType)this["type"]; } set { this["type"] = value; } } [ConfigurationProperty("customType")] public string CustomType { get { return (string)this["customType"]; } set { this["customType"] = value; } } [ConfigurationProperty("name", IsRequired = true)] public string Name { get { return (string)this["name"]; } set { this["name"] = value; } } [ConfigurationProperty("includes", IsRequired = true)] public IncludeConfigurationCollection Includes { get { return this["includes"] as IncludeConfigurationCollection; } set { this["includes"] = value; } } } public enum BundleType { None, Script, Style } public sealed class IncludeConfigurationItem : ConfigurationElement { [ConfigurationProperty("path", IsRequired = true)] public string Path { get { return (string)this["path"]; } set { this["path"] = value; } } } public class BundleConfigurationCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new BundleConfigurationItem(); } protected override object GetElementKey(ConfigurationElement element) { return ((BundleConfigurationItem)element).Name; } protected override string ElementName { get { return "bundles"; } } } public class IncludeConfigurationCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new IncludeConfigurationItem(); } protected override object GetElementKey(ConfigurationElement element) { return ((IncludeConfigurationItem)element).Path; } protected override string ElementName { get { return "includes"; } } }

A noter que j’ai géré via l’enum de le cas des bundles js et css, mais j’ai laissé la possibilité d’en utiliser d’autres (less, etc.) via la propriété customtype.

 

L’initializer qui va avec tout ça pour générer les bundles :

public static class BundleInitializer { public static void Initialize() { var section = ConfigurationManager.GetSection("bundle") as BundleSection; if (section == null) return; foreach (BundleConfigurationItem bundleConfigurationItem in section.Bundles) { Bundle bundle; if (string.IsNullOrEmpty(bundleConfigurationItem.CustomType)) { switch (bundleConfigurationItem.Type) { case BundleType.Style: bundle = new StyleBundle(bundleConfigurationItem.Name); break; case BundleType.Script: bundle = new ScriptBundle(bundleConfigurationItem.Name); break; default: bundle = new Bundle(bundleConfigurationItem.Name); break; } } else { var type = Type.GetType(bundleConfigurationItem.CustomType); bundle = Activator.CreateInstance(type, bundleConfigurationItem.Name) as Bundle; } foreach (IncludeConfigurationItem includeConfigurationItem in bundleConfigurationItem.Includes) { bundle.Include(includeConfigurationItem.Path); } BundleTable.Bundles.Add(bundle); } BundleTable.EnableOptimizations = section.EnableOptimizations; } }

Et donc, dans le global.asax, un simple appel à BundleInitializer.Initialize() suffit Smile

 

Je vais mettre le code au propre et le pousser dans un package nuget à l’occasion. En espérant que cela puisse être utile !

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Classé sous ,

Les 10 derniers blogs postés

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29

- AutoSPInstaller pour SharePoint 2013 maintenant disponible en “RTM” par Julien Chable le 05-06-2013, 23:30

- [TFS2010] A la recherche du Shelveset perdu par Blog de Jérémy Jeanson le 05-03-2013, 21:46

- .NET / Debug post-mortem : obtenir le fichier mscordacwks.dll correspondant à un dump quand on n'a plus d'accès direct à ce fichier par CoqBlog le 04-28-2013, 19:57

- [W8] Afficher un graphe par CPU dans le gestionnaire des tâches par Blog de Jérémy Jeanson le 04-28-2013, 17:48

- [WCF] Limiter proprement l’accès à vos ressources serveur par Blog de Jérémy Jeanson le 04-26-2013, 22:59

- Event : Je serai speaker à la Conf’SharePoint par Blog Technique de Romelard Fabrice le 04-26-2013, 12:00