2012-01-03 3 views
9

Je l'exigence suivante:exécution de code avant toute action

Sur chaque demande à ma page web, quelle que soit l'action que l'utilisateur tente d'invoquer, je dois appeler un code qui vérifie si une ressource est en endroit. Si c'est le cas, alors tout va bien et la méthode d'action devrait être appelée comme normale.

Cependant, si cette ressource n'est pas disponible, je souhaite que toutes les demandes renvoient une page distincte demandant à l'utilisateur de sélectionner une autre ressource parmi une liste de ressources disponibles.

Est-il possible d'exécuter une méthode avant toute méthode d'action qui a la possibilité d'annuler l'appel à la méthode action et de faire autre chose à la place?

+0

Vous pouvez implémenter votre propre HttpModule, ou peut-être mettre votre chèque dans 'Application_BeginRequest()' à l'intérieur de global.asax.cs – rejj

Répondre

16

Regardez les filtres d'action globaux (disponibles depuis asp.net mvc 3): http://msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx

Fondamentalement, dans votre Global.asax, vous pouvez enregistrer le filtre au niveau mondial lors de votre démarrage de l'application (en Application_Start()) avec:

GlobalFilters.Filters.Add(new MyActionFilterAttribute()); 

Vous pouvez alors remplacer la méthode OnActionExecuting et définir la propriété avec un résultat RedirectToRouteResult.

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (IsMyResourceAvailable()) 
    { 
     filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary { 
       { "Controller", "YourControllerName" }, 
       { "Action", "YourAction" } 
      }); 
    } 

    base.OnActionExecuting(filterContext); 
} 
5

MVC fournit plusieurs hooks pour cela.

Dans un contrôleur de base, vous pouvez remplacer Controller.OnActionExecuting(context) qui se déclenche juste avant l'exécution de l'action. Vous pouvez définir context.Result à n'importe quel ActionResult (tel que RedirectToAction) pour remplacer l'action. Vous pouvez également créer un ActionFilterAttribute et exactement comme ci-dessus, vous remplacez la méthode OnActionExecuting. Ensuite, vous appliquez simplement l'attribut à n'importe quel contrôleur qui en a besoin.

Questions connexes