2012-01-03 21 views
9

tengo el siguiente requisito:Ejecución de código antes de cualquier acción

En cada solicitud a mi página web, independientemente de la acción que el usuario está tratando de invocar, tengo que llamar a un código que comprueba si un recurso está en lugar. Si es así, todo está bien y el método de acción debe llamarse como siempre.

Sin embargo, si este recurso no está disponible, deseo que todas las solicitudes devuelvan una página por separado solicitando al usuario que seleccione otro recurso de una lista de los disponibles.

Entonces, ¿es posible ejecutar un método antes de cualquier método de acción que tenga la opción de cancelar la llamada al método de acción y hacer otra cosa?

+0

Se podría implementar su propio HttpModule, o tal vez poner su cheque en 'Application_BeginRequest()' global.asax.cs interior – rejj

Respuesta

16

observando los filtros de acción global (disponible desde asp.net mvc 3): http://msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx

Básicamente, en su Global.asax, se puede registrar el filtro a nivel mundial durante el inicio de la aplicación (en Application_Start()) con:

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

continuación, se puede anular el método OnActionExecuting, y establezca la propiedad resultado 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 proporciona varios ganchos para hacer esto.

En un controlador base, puede anular Controller.OnActionExecuting(context) que se dispara justo antes de que se ejecute la acción. Puede establecer context.Result en cualquier resultado de acción (como RedirectToAction) para anular la acción.

O bien, puede crear un ActionFilterAttribute, y exactamente como arriba, anula el método OnActionExecuting. Luego, simplemente aplica el atributo a cualquier controlador que lo necesite.

Cuestiones relacionadas