2012-03-01 21 views
43

En WebForm podríamos escribir un método en MasterPage.cs y ejecutarlo en cada solicitud.
por ejemplo:Ejecutar un método en cada solicitud en MVC, C#?

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

¿Cómo podemos hacer algo como esto en MVC?

+1

Tal vez esto http://stackoverflow.com/questions/2650269/how-do-i-get-certain-code-to-execute-before- every-single-controller-action-in-as – V4Vendetta

+1

Desea poner un ActionFilterAttribute en el controlador –

+0

Yo también o mire lo que está haciendo el método y si todavía se necesita en MVC, no tiene sentido portar algo que la nueva tecnología deja obsoleta. – TheRealTy

Respuesta

80

En ASP.NET MVC podría escribir una custom global action filter.


ACTUALIZACIÓN:

como se solicita en la sección de comentarios que aquí es un ejemplo de cómo tal filtro podría ser:

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

Si desea realizar la autorización basada en el valor de la cookie , sería más correcto implementar la interfaz 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(); 
     } 
    } 
} 

Si desea que este filtro de acción a ejecutar en cada solicitud para cada acción del controlador se podía registrarlo como un filtro de acción global en su global.asax en el método RegisterGlobalFilters:

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

Y si necesita este para ejecutar únicamente por acciones u controladores en particular, simplemente a decorar con este atributo:

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

¿Podría escribir una muestra para ello? –

+0

@Mohammad, claro, pensé que había leído el artículo al que me había vinculado en mi respuesta e intenté implementar el código de muestra que se muestra allí. Aparentemente estaba equivocado al pensar esto. Así que actualicé mi respuesta para mostrar un ejemplo. –

+0

Gracias amigo, pero una pregunta. ¿Cómo podemos redireccionar a una acción en 'MyActionFilterAttribute'? –

6

Usted podría utilizar Global.asax Application_AcquireRequestState método que se llamará en cada petición:

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

Entonces, ¿podemos acceder a Cookie y Session desde el método anterior? –

+1

Sí, puedes. pero este método se puede ejecutar más de uno por solicitud –

Cuestiones relacionadas