Magazine High tech

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

Publié le 16 février 2011 par Nicolasesprit

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 :

  • [ASP.NET MVC] Nouveautés MVC 3 Part 1 - Améliorations dans Visual Studio 2010
  • [ASP.NET MVC] Nouveautés MVC 3 Part 2 - Améliorations pour la Validation
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 à ce sujet. 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, comme par exemple lorsque le débogage est activé. Supposons que vous ayez besoin d'afficher une information lorsqu'il 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 de 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 !

Retour à La Une de Logo Paperblog

A propos de l’auteur


Nicolasesprit 16 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte