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

- Evénement monfial Global Azure Bootcamp (10 000 participants) Venez !! par Blog de Vincent THAVONEKHAM, Objet Direct le 01-25-2015, 16:29

- Mon Blog déplacé vers une version anglaise... www.thavo.com par Blog de Vincent THAVONEKHAM, Objet Direct le 01-25-2015, 16:25

- Localisation et globalisation ne sont pas des options par Blog de Jérémy Jeanson le 01-17-2015, 11:47

- [Clean Code] les commentaires… par Fathi Bellahcene le 01-10-2015, 17:17

- Mise à jour de Test Professional 2013 par Blog de Jérémy Jeanson le 01-10-2015, 11:32

- [Dynamics CRM] Ajouter un bouton pour déclencher un workflow ou un script (dialogue) par Christine Dubois le 01-09-2015, 14:03

- RDV aux #SharePoint Days 2015 à Casablanca les 28 et 29 janvier ! par Le blog de Patrick [MVP Office 365] le 01-06-2015, 08:41

- TFS Online, vous allez aimer vos projets par Blog de Jérémy Jeanson le 01-03-2015, 11:19

- Bon code 2015 ! par Blog de Jérémy Jeanson le 01-02-2015, 19:01

- [Dynamics CRM] Créer un contact à partir d’une signature email par Christine Dubois le 12-30-2014, 14:37