2010-04-16 4 views
35

Ich möchte einige Dinge über den Status der Sitzung, der Benutzer-Agent, etc. überprüfen, und möglicherweise Maßnahmen ergreifen und eine spezielle Ansicht zurück, bevor eine Controller-Methode eine Chance zur Ausführung bekommt. Zum Beispiel:Wie bekomme ich bestimmten Code, der vor jeder einzelnen Controlleraktion in ASP.NET MVC 2 ausgeführt werden soll?

Meistgenannte:
Benutzer fordert Home/Index
System prüft, um sicherzustellen, dass x = 0 zu machen
x ist nicht gleich Null, so dass der Home/Index-Controller ausführt wie normal!.

Aber manchmal:
Benutzer fordert Home/Index
System prüft, dass x zu machen = 0.
x gleich Null TUT!. Der Benutzer muss benachrichtigt werden und die angeforderte Controller-Aktion darf nicht ausgeführt werden.

I denken Dies beinhaltet die Verwendung von ActionFilters. Aber ich habe über sie gelesen und ich verstehe nicht, ob ich die Controller-Methode vorwegnehmen und eine Ansicht zurückgeben kann, bevor sie ausgeführt wird. Ich bin sicher, ich könnte Code ausführen, bevor die Controller-Methode ausgeführt wird, aber wie kann ich verhindern, dass sie in einigen Instanzen ausgeführt wird und eine benutzerdefinierte Ansicht zurückgibt oder direkt auf eine andere Controller-Methode verweist?

Update: Ich implementierte die RM-Lösung. Das ist, was ich tat:

public class MyAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (myValue == wrongValue) 
     { 
      filterContext.Result = new ViewResult{ViewName = "Notice"}; 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

Nun, wenn myValue falsch ist, diese Benutzer erhalten die Mitteilung Ansicht und die angeforderte Controller wird nie ausgeführt. Um dies zu erreichen, habe ich es auf eine ControllerBase angewendet, von der alle meine Controller erben.

+0

Hallo Chris. Lass mich wissen, wie bist du dazu gekommen? –

Antwort

41

Alles hängt, was genau Sie tun wollen, und wie. Drei Optionen unten:


Sie können hierfür die Einschränkungen für die Route verwenden. Sie werden ausgeführt, wenn die zu vergleichende Route ausgewertet wird.

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

// without constraint, i.e. if above didnt pass 
routes.MapRoute(
    "HomeWithConstraint", 
    "Home/{action}", 
    new {controller="Home", action="index"} 
); 

Der obige MyCustomRouteConstraint-Typ würde in Ihrem Beispiel nach x == 0 usw. suchen. Nicht sicher, was genau Sie tun möchten, aber dies ermöglicht Ihnen, die Bedingungen vor der Ausführung zu überprüfen und zusätzliche Routenwerte usw. festzulegen.

Siehe here zum Beispiel für benutzerdefinierte Routenbeschränkungen.


Alternativly, ja können Sie einen benutzerdefinierten Actionfilter verwenden, gelten sie nur für die Controller-Klasse, und es wird vor der Aktion aufgerufen werden, jede ausgeführt wird.Etwas wie:

public class CheckXActionFilterAttribute : ActionFilterAttribute 
{ 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if(x == 0) 
      { 
       // do something 
       // e.g. Set ActionParameters etc 
      } 
      else 
      { 
       // do something else 
      } 
     } 


} 

Eine weitere Option ist es, alle Sie Controller haben (oder die entsprechenden sind) erben von einem benutzerdefinierten Controller, den Sie machen, und außer Kraft setzen:

OnActionExecuting 

Siehe here für weitere Einzelheiten.

Um das gleiche wie den Filter oder Routing-Einschränkungen zu tun.

Verwandte Themen