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

- « Naviguer vers le haut » dans une librairie SharePoint par Blog de Jérémy Jeanson le 10-07-2014, 13:21

- PowerShell: Comment mixer NAGIOS et PowerShell pour le monitoring applicatif par Blog Technique de Romelard Fabrice le 10-07-2014, 11:43

- ReBUILD 2014 : les présentations par Le blog de Patrick [MVP Office 365] le 10-06-2014, 09:15

- II6 Management Compatibility présente dans Windows Server Technical Preview avec IIS8 par Blog de Jérémy Jeanson le 10-05-2014, 17:37

- Soft Restart sur Windows Server Technical Preview par Blog de Jérémy Jeanson le 10-03-2014, 19:43

- Non, le certificat public du CA n’est pas un certificat client !!! par Blog de Jérémy Jeanson le 10-03-2014, 00:08

- Windows Server Technical Preview disponible via MSDN par Blog de Jérémy Jeanson le 10-02-2014, 19:05

- Focus Sauvegardes SharePoint par Le blog de Patrick [MVP Office 365] le 10-02-2014, 13:11

- Technofolies, votre évènement numérique de l'année par Le Blog (Vert) d'Arnaud JUND le 09-26-2014, 18:40

- Xamarin : From Zero to Hero par Fathi Bellahcene le 09-24-2014, 17:35