2010-04-16 12 views
35

Quiero comprobar algunas cosas sobre el estado de la sesión, el agente de usuario, etc., y posiblemente tomar medidas y devolver una vista especial ANTES de que un método de controlador tenga la oportunidad de ejecutarse. Por ejemplo:¿Cómo puedo obtener cierto código para ejecutar antes de cada acción de controlador único en ASP.NET MVC 2?

más comunes:
El usuario solicita Inicio/Índice
controles del sistema para asegurarse de que x = 0.
x no es igual a cero, por lo que el controlador de Inicio/Índice ejecuta como normal!.

Pero, a veces:
El usuario solicita Inicio/Índice
controles del sistema para asegurarse de que x = 0.
x es igual a cero!. Se debe notificar al usuario y no se puede permitir que se ejecute la acción del controlador solicitada.

I think esto implica el uso de ActionFilters. Pero he leído sobre ellos y no entiendo si puedo anticipar el método del controlador y devolver una vista antes de que se ejecute. Estoy seguro de que podría ejecutar el código antes de que se ejecute el método del controlador, pero ¿cómo puedo evitar que se ejecute en algunas instancias y devolver una vista personalizada, o dirigir a un método de controlador diferente?

Actualización: Implementé la solución de RM. Esto es lo que hice:

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

Ahora, cuando myValue está mal, los usuarios obtienen la vista Aviso y el controlador solicitado nunca se ejecuta. Para que esto funcione, lo apliqué a un ControllerBase del que heredaron todos mis controladores.

+0

Hola chris. Déjame saber cómo lo hiciste? –

Respuesta

41

Todo depende de qué es exactamente lo que quiere hacer y cómo. Tres opciones a continuación:


Puede usar restricciones de ruta para esto. Se ejecutan al evaluar la ruta para que coincida.

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"} 
); 

tipo MyCustomRouteConstraint El anterior sería comprobar si x == 0, etc en su ejemplo. No estoy seguro exactamente de lo que quiere hacer, pero esto le permitirá verificar las condiciones antes de ejecutar y establecer valores de ruta adicionales, etc.

Consulte here por ejemplo de restricciones de ruta personalizadas.


Alternativly, sí se puede utilizar un ActionFilter costumbre, sólo se aplica a la clase del controlador, y se va a llamar antes de ejecutar cualquier acción.Algo así como:

public class CheckXActionFilterAttribute : ActionFilterAttribute 
{ 

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


} 

Otra opción es hacer que todos los controladores de usted (o los más relevantes) heredar de un controlador a medida que realice, y anular:

OnActionExecuting 

Ver here para más detalles.

Para hacer lo mismo que el filtro o las restricciones de enrutamiento.

Cuestiones relacionadas