févr. 16 2011

[ASP.NET MVC] Nouveautés MVC 3 Part 3 - Global Action FIlters

Category: ASP.NET | ASP.NET MVC | ASP.NET MVC 3Nicolas Esprit @ 18:55

Suite de la série de billets sur les nouveautés d'ASP.NET MVC 3 écrits conjointement avec Philippe Viallate, MVP et responsable de la rubrique .NET sur Developpez.com. Vous pouvez consulter les précédents billets :

Un filtre d'action est un attribut que vous pouvez appliquer sur une action d'un contrôleur ou sur un contrôleur entier et qui modifie la façon dont l'action est exécutée (pour plus d'informations à ce sujet consultez l'article Developpez). Avec ASP.NET MVC 1 et 2 vous pouvez spécifier des filtres sur les contrôleurs, et donc sur toutes ses actions, en utilisant une syntaxe d'attribut comme ci-dessous :

[MyActionFilter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}

public ActionResult About()
{
return View();
}
}
 
Les développeurs souhaitent souvent appliquer une logique de filtre sur tous les contrôleurs au sein d'une application. ASP.NET MVC 3 permet maintenant de spécifier un filtre qui doit s'appliquer globalement à tous les contrôleurs d'une application. Vous pouvez maintenant le faire en les ajoutant à la collection GlobalFilters. Une méthode RegisterGlobalFilters est maintenant incluse par défaut dans le fichier Global.asax afin de fournir un endroit pratique pour réaliser cela :
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyActionFilterAttribute());
}

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
 
Cette nouveauté est très pratique si vous voulez qu'elle s'applique à tous les contrôleurs et les actions de votre application. Mais que faire si vous voulez qu'elle ne s'applique que sous certaines conditions. Supposons que vous ayez besoin d'afficher une information par exemple lorsque le débogage est activé, mais lorsque vous déployez en production vous ne voulez pas que vos utilisateurs la voient. On utilisera pour cela un fournisseur de filtre personnalisé. Votre classe doit mettre en oeuvre l'interface en IFilterProvider. Le code ci-dessous illustre cet exemple :

public class DebugFilterProvider : IFilterProvider
{
private readonly List<Func<ControllerContext, object>> _conditions = new List<Func<ControllerContext, object>>();
public void Add(Func<ControllerContext, object> condition)
{
_conditions.Add(condition);
}

public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
return from condition in _conditions
select condition(controllerContext) into filter
where filter != null
select new Filter(filter, FilterScope.Global);
}
}
 
La méthode GetFilters boucle sur toutes les conditions, qui est en fait une liste générique qui contient un délégué, et si ce délégué n'est pas null, alors il va créer un nouvel objet filtre et le renvoyer. Ainsi dans votre fichier Global.asax, vous pouvez ajouter ce code afin que ce filtre fonctionne uniquement lorsque le débogage est activé :
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
var provider = new DebugFilterProvider();
provider.Add(c => c.HttpContext.IsDebuggingEnabled ? new MyActionFilterAttribute() : null);
FilterProviders.Providers.Add(provider);
}
 
Les Global Action Filters ainsi que l'utilisation de conditions offrent de nombreuses possibilités. On peut par exemple imaginer la déclaration d'un ActionFilter dans le Global.asx pour toutes les actions nommées "Index" dans notre application. Cette nouveauté MVC 3 en réjouira plus d'un !

 

Tags: , , ,

Commentaires

1.
pingback topsy.com says:

Pingback from topsy.com

Twitter Trackbacks for
        
        aspnetmvc Nouveautés MVC 3 Part 3 - Global Action FIlters
        [nicolasesprit.com]
        on Topsy.com

2.
trackback ASP.NET Français Blogs says:

[ASP.NET MVC] Nouveautés MVC 3 Part 10 - Upgrader ses projets ASP.NET MVC 2 vers MVC 3

Avant de mettre fin à cette série de billet sur les nouveautés d'ASP.NET MVC

Les commentaires sont clos