37 votes

Comment puis-je faire en sorte qu'un certain code s'exécute avant chaque action de contrôleur dans ASP.NET MVC 2 ?

Je veux vérifier certaines choses sur l'état de la session, l'agent utilisateur, etc., et éventuellement prendre des mesures et renvoyer une vue spéciale AVANT qu'une méthode du contrôleur ait la possibilité de s'exécuter. Par exemple:

Le plus courant:
L'utilisateur demande Home/Index
Le système vérifie que x != 0.
x n'est pas égal à zéro, donc le contrôleur Home/Index s'exécute normalement.

Mais, parfois:
L'utilisateur demande Home/Index
Le système vérifie que x != 0.
x EST égal à zéro. L'utilisateur doit être informé et l'action du contrôleur demandée ne peut pas être autorisée à s'exécuter.

Je pense que cela implique l'utilisation de filtres d'actions. Mais j'ai lu à leur sujet et je ne comprends pas si je peux devancer la méthode du contrôleur et renvoyer une vue avant son exécution. Je suis sûr que je pourrais exécuter du code avant l'exécution de la méthode du contrôleur, mais comment l'empêcher de s'exécuter dans certains cas et de renvoyer une vue personnalisée, ou de rediriger vers une méthode de contrôleur différente?

Mise à jour: J'ai implémenté la solution de RM. Voici ce que j'ai fait:

public class MonAttribut : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (maValeur == mauvaiseValeur)
        {
            filterContext.Result = new ViewResult{ViewName = "Avis"};
        }
        base.OnActionExecuting(filterContext);
    }
}

Maintenant, lorsque maValeur est incorrecte, ces utilisateurs obtiennent la vue Avis et le contrôleur demandé n'est jamais exécuté. Pour que cela fonctionne, je l'ai appliqué à un ControllerBase dont tous mes contrôleurs héritent.

45voto

Rosstified Points 2327

Tout dépend de ce que vous voulez faire exactement et comment. Trois options ci-dessous :


Vous pouvez utiliser des contraintes de route pour cela. Elles sont exécutées lors de l'évaluation de la route à faire correspondre.

routes.MapRoute(
    "HomeWithConstraint",
    "Home/{action}",
    new {controller="Home", action="index"},
    new { x = new MyCustomRouteConstraint () }
);

// sans contrainte, c'est-à-dire si la première n'a pas réussi
routes.MapRoute(
    "HomeWithConstraint",
    "Home/{action}",
    new {controller="Home", action="index"}
);

Le type MyCustomRouteConstraint ci-dessus vérifierait par exemple x == 0 dans votre exemple. Je ne suis pas sûr exactement de ce que vous voulez faire, mais cela vous permettra de vérifier les conditions avant l'exécution et de définir des valeurs de route supplémentaires, etc.

Voir ici pour un exemple de contraintes de route personnalisées.


Alternativement, oui vous pouvez utiliser un ActionFilter personnalisé, il suffit de l'appliquer à la classe du contrôleur, et il sera appelé avant l'exécution de toute action. Quelque chose comme :

public class CheckXActionFilterAttribute : ActionFilterAttribute
{

      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
           if(x == 0)
           {
               // faire quelque chose
               // par exemple définir des paramètres d'action etc
           }
           else
           {
               // faire quelque chose d'autre
           }
      }

}

Une autre option est de faire hériter tous vos contrôleurs (ou ceux concernés) d'un contrôleur personnalisé que vous créez, et de remplacer :

OnActionExecuting

Voir ici pour plus de détails.

Pour faire la même chose que le filtre ou les contraintes de routage.

0voto

Hussein Points 559

Une façon de faire cela est de rediriger vers un autre ActionMethod pour afficher la vue. Un exemple de code se trouve dans cette discussion :

Redirection vers un contrôleur et une action spécifiés dans un filtre d'action asp.net mvc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X