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.
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.
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 :
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.
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.
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