Comprendre les filtres d'actions

Lainé Vincent (Traduction)

Le but de ce tutoriel est d'expliquer les filtres d'actions. un filtre d'action est un attibut que vous pouvez appliquer sur une action d'un controleur ou sur un controleur entier et qui modifie la façon dont l'action est exécutée.

- Titre : Comprendre les filtres d'actions

- Auteur : Lainé Vincent (Traduction)

- Parution : 23 avril 2009

- Licence : Copyright ® 2009 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Traduction

- B. Introduction

- III. Utiliser un filtre d'action

- C. Les différents types de filtres

- D. La classe de base ActionFilterAttribute

- E. Création d'un filtre d'action de log

- F. Conclusion

Traduction

Cet article est la traduction la plus fidèle possible de l'article original : Understanding Action Filters

B - Introduction

Le but de ce tutoriel est d'expliquer les filtres d'actions. un filtre d'action est un attibut que vous pouvez appliquer sur une action d'un controleur ou sur un controleur entier et qui modifie la façon dont l'action est exécutée. Le framework MVC inclu un certain nombres de filtres :

- OutputCache : Ce filtre d'action met en cache la réponse d'une action pour un certain temps

- HandleError : Ce filtre d'action intercepte les erreurs lors de l'exécution d'une action

- Authoriez : Ce filtre d'action vous permez de restreindre l'accès à une action à un certain utilisateur ou rôle.

Vous pouvez également créer vos propres filtres d'actions. Par exemple vous pouvez vouloir créer votre propre filtre d'action pour implémenter un système d'authentification personnalisé. ou vous pouvez vouloir créer un filtre d'action qui modifie la vue de données qui est renvoyée par une action.
Dans ce tutoriel vous allez apprendre à créer vos propres filtres d'action depuis le début. nous allons créer un filtre d'action qui log un certain nombre d'étapes d'exécution d'une action et qui écrit dans le panneau "Sortie" de Visual Studio.

III - Utiliser un filtre d'action

Un filtre d'action est un attribut. Vous pouvez appliquer la plus part des filtres d'action sur une action particulière ou sur le controleur entier.

Par exemple, le controleur "Data" dans le code en dessous expose une action Index() qui retourne l'heure courante. Cette action est décoré avec l'attribut de filtre d'action [OuputCache]. Ce filtre met en cache la réponse pour 10 secondes.

Controllers\DataController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
public class DataController : Controller
{
[OutputCache(Duration=10)]
public string Index()
{
return DateTime.Now.ToString("T");
}
}
}

Si vous appellez plusieurs fois à la suite l'action Index() en entrant l'URL /Data/Index dans votre navigateur, vous verrez la même heure pendant 10 secondes. Le résultat de l'action Index() est bien mis en cache pendant 10 secondes.

L'heure est mise en cache grâce à l'attribut [OutputCache]

Dans le code précédant, un seul attribut est appliqué à l'action Index(). Si vous avez besoin vous pouvez appliquer plusieurs filtres d'action à la même action. Par exemple vous pouvez appliquer le filtre [OutputCache] et le filtre [HandleError] à la même action.

Dans le code précédant, le filtre OutputCache est appliqué à l'action Index(). Vous pouvez également l'appliquer au controleur, dans ce cas tout les résultats renvoyés par les actions du controleur seront mis en cache pour 10 secondes.

C - Les différents types de filtres

Le framework ASP.NET MVC supporte 4 types de filtre différents.

- Authorization filters : Implémentent l'attribut IAuthorizationFilter

- Action filters : Implémentent l'attribut IActionFilter

- Result filters : Implémentent l'attribut IResultFilter

- Exception filters : Implémentent l'attribut IExceptionFilter.

Les filtres sont exécutés dans l'ordre cité au dessus. Par exemple, les filtres d'autorisation sont toujours exécutés avant tout les autres filters.

Les filtres d'authentifications sont utilisés pour implémenter l'authentification et les autorisations pour une action. Le filtre Authorize est un exemple de filtre d'authorisation.

les filtres d'Action contiennent la logique exécutée avant et après une action. Vous pouvez utiliser les filtres d'actions pour, par exemple, modifier les données d'une vue renvoyer en résultat.

Les filtres de résultats contiennent la logique qui est exécuté avant et après l'exécution d'un Viewresult. Par exemple vous pouvez modifier une vue juste avant qu'elle ne soit renvoyée au navigateur.

Les filtres d'exceptions sont exécutés en dernier. Vous pouvez utiliser les filtres d'exception pour intercepter les exceptions levées votre action ou votre résultat d'action. Vous pouvez également utiliser les filtres d'exception pour logger les exceptions.

Tout les types de filtres sont exécutés dans un ordre particulier. Si vous souhaitez controler l'ordre d'exécution des filtres d'un même type vous pouvez positionner une valeur sur la propriété Order des filtres.

La classe de base de tout les filtres d'attribut est System.Web.Mvc.FilterAttribute. Si vous voulez implémenter un type particulier de filtre, vous devez créer une classe qui hérite de la classe de base et implémenter une ou plusieurs interface de type IAuthorizedFilter, IActionFilter, IResultFilter, ou ExceptionFilter

D - La classe de base ActionFilterAttribute

Afin de faciliter au maximun l'implémentation d'un filtre personnalisé, le framework ASP.NET MVC inclut une classe de base ActionFilterAttribute. Cette classe implémente les interfaces IActionFilter et IResultFilter et hérite de la classe Filter.

La terminologie n'est pas clair. Techniquement, une classe qui hérite de ActionFilterAttribute est à la fois un filtre d'action et un filtre de resultat. Toutefois le terme filtre d'action est utilisé pour désigner n'importe quel type de filtre dans le framework MVC.

La classe ActionFilterAttribute possède les méthodes suivantes que vous pouvez implémenter.

- OnActionExecuting : Cette méthode est appelée avant qu'une action ne soit exécutée

- OnActionExecuted : Cette méthode est appelée après qu'une action soit exécutée

- OnResultExecuting : Cette méthode est appelée avant qu'un résultat d'action ne soit exécutée

- OnResultExecuted : Cette méthode est appelée après qu'un résultat d'action soit exécutée

Dans la prochaine partie, nous verrons comment implémenter les différentes méthodes.

E - Création d'un filtre d'action de log

Afin d'illustrer comment créer un filtre d'action personnalisé, nous allons créer un filtre d'action qui va logger chaque étape dans le panneau "Sortie" de Visual Studio. Notre LogActionFilter est écrit ci dessous :

ActionFilters\LogActionFilter.cs

using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.ActionFilters
{
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Log("OnActionExecuting", filterContext.RouteData);
}

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log("OnActionExecuted", filterContext.RouteData);
}

public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Log("OnResultExecuting", filterContext.RouteData);
}

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log("OnResultExecuted", filterContext.RouteData);
}

private void Log(string methodName, RouteData routeData)
{
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
Debug.WriteLine(message, "Action Filter Log");
}

}
}

Dans le code ci dessous les méthodes OnActionExecuting(), OnActionExecuted(), OnResultExecuting(), et OnResultExecuted() appelle toute la méthode Log(). Le nom de la méthode et les données actuelles sont passées à la méthode Log(). La méthode Log() écrit un message dans le panneau "Sortie" de Visual Studio.

Les logs dans le panneau Sortie de Visual Studio

Le controleur Home dans le code ci dessous, montre comment le filtre d'action Log qui est appliqué au controleur entier. A chaque fois qu'une action du controleur est appelé les étapes sont loggées dans le panneau "Sortie" de Visual Studio.

Controllers\HomeController.cs

using System.Web.Mvc;
using MvcApplication1.ActionFilters;

namespace MvcApplication1.Controllers
{
[LogActionFilter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}

public ActionResult About()
{
return View();
}
}
}

F - Conclusion

Dans ce tutoriel nous avons vu les filtres d'action. Vous avez vu les 4 types de filtres d'action différents : authorization filters, action filters, result filters, et exception filters. Vous avez également vu la classe de base ActionFilterAttribute Finalement vous avez appris à créer votre propre filtre d'action. Nous avons créer un filtre d'action qui log les différentes étapes dans le panneau "Sortie" de Visual Studio