2012-03-01 13 views
43

In WebForm è possibile scrivere un metodo in MasterPage.cs ed eseguito in ogni richiesta.
es:Eseguire un metodo in ogni richiesta in MVC, C#?

MasterPage.cs 
-------------- 
protected void Page_Load(object sender, EventArgs e) 
{ 
    CheckCookie(); 
} 

Come possiamo fare qualcosa di simile in MVC?

+1

Forse questo http://stackoverflow.com/questions/2650269/how-do-i-get-certain-code-to-execute-before- ogni singolo controller-action-in-come – V4Vendetta

+1

Si desidera inserire un ActionFilterAttribute sul controller –

+0

Vorrei o guarda cosa sta facendo il metodo e se è ancora necessario in MVC, nessun punto che porti qualcosa che la nuova tecnologia rende obsoleta. – TheRealTy

risposta

80

In ASP.NET MVC si potrebbe scrivere un custom global action filter.


UPDATE:

Come richiesto nella sezione commenti qui è un esempio di come tale filtro potrebbe essere simile:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var fooCookie = filterContext.HttpContext.Request.Cookies["foo"]; 
     // TODO: do something with the foo cookie 
    } 
} 

Se si desidera eseguire l'autorizzazione in base al valore del cookie , sarebbe più corretto implementare l'interfaccia IAuthorizationFilter:

public class MyActionFilterAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var fooCookie = filterContext.HttpContext.Request.Cookies["foo"]; 

     if (fooCookie == null || fooCookie.Value != "foo bar") 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 
} 

Se si desidera che questo filtro azione da eseguire su ogni richiesta per ogni azione di controllo si potrebbe registrarlo come un filtro d'azione globale nel vostro global.asax nel metodo RegisterGlobalFilters:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new MyActionFilterAttribute()); 
} 

E se hai bisogno di questo per eseguire solo per particolari azioni o controllori semplicemente li decorano con questo attributo:

[MyActionFilter] 
public ActionResult SomeAction() 
{ 
    ... 
} 
+0

Potresti scrivere un campione per questo? –

+0

@Mohammad, certo, ho pensato di leggere l'articolo a cui mi sono collegato nella mia risposta e ho cercato di implementare il codice di esempio mostrato lì. A quanto pare ho sbagliato a pensarlo. Quindi ho aggiornato la mia risposta per mostrare un esempio. –

+0

Grazie amico, ma una domanda. come possiamo reindirizzare a un'azione in "MyActionFilterAttribute'? –

6

Si potrebbe utilizzare Global.asax Application_AcquireRequestState metodo che andranno chiamato su ogni richiesta:

protected void Application_AcquireRequestState(object sender, EventArgs e) 
{ 
    //... 
} 
+2

Quindi, possiamo accedere a Cookie e Sessione dal metodo sopra? –

+1

Sì, è possibile. ma questo metodo può essere eseguito più di uno su richiesta –

Problemi correlati