2012-01-03 16 views
9

Ho il seguente requisito:esecuzione di codice prima di qualsiasi azione

su ogni richiesta alla mia pagina web, indipendentemente da quale azione l'utente sta cercando di richiamare, ho bisogno di chiamare un certo codice che controlla se una risorsa è in posto. Se lo è, allora tutto va bene e il metodo di azione dovrebbe essere chiamato come normale.

Tuttavia, se questa risorsa non è disponibile, desidero che tutte le richieste restituiscano una pagina separata che chiede all'utente di selezionare un'altra risorsa da un elenco di quelli disponibili.

Quindi è possibile eseguire un metodo prima di qualsiasi metodo di azione che ha l'opzione di annullare la chiamata al metodo di azione e fare qualcos'altro invece?

+0

È possibile implementare il proprio HttpModule, o magari inserire il proprio assegno in "Application_BeginRequest()" all'interno di global.asax.cs – rejj

risposta

16

Guarda filtri d'azione globali (disponibili dal asp.net MVC 3): http://msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx

In sostanza, in Global.asax, è possibile registrare il filtro a livello globale durante il vostro avvio dell'applicazione (in Application_Start()) con:

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

è quindi possibile eseguire l'override del metodo OnActionExecuting, e impostare la proprietà dei risultati con un RedirectToRouteResult.

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

    base.OnActionExecuting(filterContext); 
} 
5

MVC fornisce diversi hook per eseguire questa operazione.

In un controller di base, è possibile eseguire l'override di Controller.OnActionExecuting(context) che si attiva immediatamente prima dell'esecuzione dell'azione. È possibile impostare context.Result in qualsiasi ActionResult (ad esempio RedirectToAction) per sovrascrivere l'azione.

In alternativa, è possibile creare un ActionFilterAttribute e, esattamente come sopra, si esegue l'override del metodo OnActionExecuting. Quindi, devi solo applicare l'attributo a qualsiasi controller che ne ha bisogno.

Problemi correlati