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

- [ #SharePoint 2016 ] frappe à nos portes ! (1/2) par Le blog de Patrick [MVP Office 365] le 04-19-2015, 23:21

- Lync devient Skype Entreprise par Le petit blog de Pierre / Pierre's little blog le 04-18-2015, 22:47

- [WCF] Prendre la main sur les protocoles par Blog de Jérémy Jeanson le 04-18-2015, 12:57

- yOS Tour Geneva - Retour des sessions par Blog Technique de Romelard Fabrice le 04-16-2015, 11:54

- YOS Genève 2015 : gestion des gros fichiers et plus … par The Mit's Blog le 04-13-2015, 11:56

- YOS Genève 2015 : App et bonnes pratiques par The Mit's Blog le 04-13-2015, 10:55

- [YOS Genève 2015] : Et si on adoptait enfin nos espaces collaboratifs par The Mit's Blog le 04-13-2015, 09:48

- [WCF] Les bases d’une configuration clean par Blog de Jérémy Jeanson le 04-11-2015, 11:48

- Dernière partie de cache cache avec l’AppFabric le 2/04/2016 par Blog de Jérémy Jeanson le 04-08-2015, 23:01

- [WCF] Binding REST et SSL, c’est possible par Blog de Jérémy Jeanson le 04-04-2015, 09:19