Présentation des filtres d’actions (C#)
par Microsoft
L’objectif de ce tutoriel est d’expliquer les filtres d’action. Un filtre d’action est un attribut que vous pouvez appliquer à une action de contrôleur (ou à un contrôleur entier) qui modifie la façon dont l’action est exécutée.
Présentation des filtres d’action
L’objectif de ce tutoriel est d’expliquer les filtres d’action. Un filtre d’action est un attribut que vous pouvez appliquer à une action de contrôleur (ou à un contrôleur entier) qui modifie la façon dont l’action est exécutée. L’infrastructure MVC ASP.NET comprend plusieurs filtres d’action :
- OutputCache : ce filtre d’action met en cache la sortie d’une action de contrôleur pendant une durée spécifiée.
- HandleError : ce filtre d’action gère les erreurs générées lorsqu’une action de contrôleur s’exécute.
- Autoriser : ce filtre d’action vous permet de restreindre l’accès à un utilisateur ou à un rôle particulier.
Vous pouvez également créer vos propres filtres d’action personnalisés. Par exemple, vous pouvez créer un filtre d’action personnalisé afin d’implémenter un système d’authentification personnalisé. Vous pouvez également créer un filtre d’action qui modifie les données d’affichage retournées par une action de contrôleur.
Dans ce tutoriel, vous allez apprendre à créer un filtre d’action à partir de zéro. Nous créons un filtre d’action de journalisation qui journalise les différentes étapes du traitement d’une action dans la fenêtre Sortie de Visual Studio.
Utilisation d’un filtre d’action
Un filtre d’action est un attribut. Vous pouvez appliquer la plupart des filtres d’action à une action de contrôleur individuelle ou à un contrôleur entier.
Par exemple, le contrôleur de données dans la liste 1 expose une action nommée Index()
qui retourne l’heure actuelle. Cette action est décorée avec le filtre d’action OutputCache
. Ce filtre entraîne la mise en cache de la valeur retournée par l’action pendant 10 secondes.
Listing 1 – 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 appelez l’action Index()
à plusieurs reprises en entrant l’URL /Data/Index dans la barre d’adresse de votre navigateur et en appuyant plusieurs fois sur le bouton Actualiser, vous verrez la même durée pendant 10 secondes. La sortie de l’action Index()
est mise en cache pendant 10 secondes (voir la figure 1).
Figure 01 : Heure mise en cache (cliquer pour afficher l’image en taille réelle)
Dans la liste 1, un filtre d’action unique ( le OutputCache
filtre d’action ) est appliqué à la Index()
méthode . Si vous en avez besoin, vous pouvez appliquer plusieurs filtres d’action à la même action. Par exemple, vous pouvez appliquer les filtres d’action OutputCache
et HandleError
à la même action.
Dans la liste 1, le OutputCache
filtre d’action est appliqué à l’action Index()
. Vous pouvez également appliquer cet attribut à la DataController
classe elle-même. Dans ce cas, le résultat retourné par toute action exposée par le contrôleur est mis en cache pendant 10 secondes.
Les différents types de filtres
L’infrastructure MVC ASP.NET prend en charge quatre types de filtres différents :
- Filtres d’autorisation : implémente l’attribut
IAuthorizationFilter
. - Filtres d’action : implémente l’attribut
IActionFilter
. - Filtres de résultats : implémente l’attribut
IResultFilter
. - Filtres d’exception : implémente l’attribut
IExceptionFilter
.
Les filtres sont exécutés dans l’ordre indiqué ci-dessus. Par exemple, les filtres d’autorisation sont toujours exécutés avant que les filtres d’action et les filtres d’exception soient toujours exécutés après chaque autre type de filtre.
Les filtres d’autorisation sont utilisés pour implémenter l’authentification et l’autorisation pour les actions du contrôleur. Par exemple, le filtre Autoriser est un exemple de filtre d’autorisation.
Les filtres d’action contiennent une logique exécutée avant et après l’exécution d’une action de contrôleur. Vous pouvez utiliser un filtre d’action, pour instance, pour modifier les données d’affichage retournées par une action de contrôleur.
Les filtres de résultats contiennent une logique exécutée avant et après l’exécution d’un résultat d’affichage. Par exemple, vous pouvez modifier un résultat d’affichage juste avant que l’affichage ne soit rendu dans le navigateur.
Les filtres d’exception sont le dernier type de filtre à exécuter. Vous pouvez utiliser un filtre d’exception pour gérer les erreurs générées par les actions de votre contrôleur ou les résultats de l’action du contrôleur. Vous pouvez également utiliser des filtres d’exception pour journaliser les erreurs.
Chaque type de filtre différent est exécuté dans un ordre particulier. Si vous souhaitez contrôler l’ordre dans lequel les filtres du même type sont exécutés, vous pouvez définir la propriété Order d’un filtre.
La classe de base pour tous les filtres d’action est la System.Web.Mvc.FilterAttribute
classe . Si vous souhaitez implémenter un type particulier de filtre, vous devez créer une classe qui hérite de la classe Filter de base et implémente une ou plusieurs interfaces IAuthorizationFilter
, IActionFilter
, IResultFilter
, ou IExceptionFilter
.
Classe ActionFilterAttribute de base
Pour faciliter l’implémentation d’un filtre d’action personnalisé, l’infrastructure MVC ASP.NET inclut une classe de base ActionFilterAttribute
. Cette classe implémente les IActionFilter
interfaces et et IResultFilter
hérite de la Filter
classe .
La terminologie utilisée ici n’est pas entièrement cohérente. Techniquement, une classe qui hérite de la classe ActionFilterAttribute est à la fois un filtre d’action et un filtre de résultats. Toutefois, au sens large, le filtre d’action du mot est utilisé pour faire référence à n’importe quel type de filtre dans l’infrastructure ASP.NET MVC.
La classe de base ActionFilterAttribute
a les méthodes suivantes que vous pouvez remplacer :
- OnActionExecuting : cette méthode est appelée avant l’exécution d’une action de contrôleur.
- OnActionExecuted : cette méthode est appelée après l’exécution d’une action de contrôleur.
- OnResultExecuting : cette méthode est appelée avant l’exécution d’un résultat d’action de contrôleur.
- OnResultExecuted : cette méthode est appelée après l’exécution d’un résultat d’action de contrôleur.
Dans la section suivante, nous verrons comment implémenter chacune de ces différentes méthodes.
Création d’un filtre d’action de journal
Pour illustrer comment vous pouvez créer un filtre d’action personnalisé, nous allons créer un filtre d’action personnalisé qui journalise les étapes du traitement d’une action de contrôleur dans la fenêtre Sortie de Visual Studio. Notre LogActionFilter
figure dans la liste 2.
Listing 2 – 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 la liste 2, les OnActionExecuting()
méthodes , OnActionExecuted()
, OnResultExecuting()
et OnResultExecuted()
appellent toutes la Log()
méthode . Le nom de la méthode et les données d’itinéraire en cours sont passés à la Log()
méthode. La Log()
méthode écrit un message dans la fenêtre Sortie de Visual Studio (voir la figure 2).
Figure 02 : Écriture dans la fenêtre Sortie de Visual Studio (cliquer pour afficher l’image en taille réelle)
Le contrôleur d’accueil de la liste 3 illustre comment appliquer le filtre d’action Journal à une classe de contrôleur entière. Chaque fois que l’une des actions exposées par le contrôleur d’accueil est appelée (méthode Index()
ou About()
méthode), les étapes de traitement de l’action sont enregistrées dans la fenêtre Sortie de Visual Studio.
Listing 3 – 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();
}
}
}
Résumé
Dans ce tutoriel, vous avez découvert ASP.NET filtres d’action MVC. Vous avez découvert les quatre types de filtres différents : les filtres d’autorisation, les filtres d’action, les filtres de résultats et les filtres d’exception. Vous avez également découvert la classe de base ActionFilterAttribute
.
Enfin, vous avez appris à implémenter un filtre d’action simple. Nous avons créé un filtre d’action de journalisation qui journalise les étapes du traitement d’une action de contrôleur dans la fenêtre Sortie de Visual Studio.