2010-07-09 41 views
159

He tratado de dos maneras: Response.Redirect() que no hace nada, así como llamar a un nuevo método en el interior del controlador base que devuelve un ActionResult y tienen que volver RedirectToAction (...) ninguno de estos trabajos.¿Cómo redirigir desde OnActionExecuting en el controlador base?

¿Cómo puedo hacer una redirección desde el método OnActionExecuting?

Respuesta

310
public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ... 
    if (needToRedirect) 
    { 
     ... 
     filterContext.Result = new RedirectResult(url); 
     return; 
    } 
    ... 
} 
+71

En lugar de 'new RedirectResult (url)', también podría usar 'new RedirectToAction (string action, string controller)'. Esto puede haber sido agregado a MVC después de haber publicado su respuesta. Tu solución me puso en el camino correcto de todos modos. – Manfred

+3

+1000 ¡Gracias! – IamStalker

+0

¿De esta manera no ejecutará lo que está en su acción actual? ¿No sería esto un defecto de seguridad? Digamos que hay una acción que elimina un usuario enrutado por/Admin/Delete/4. Si su condición es verificar que usted es un administrador, y redirigir si no es así. El usuario 4 será eliminado, incluso si usted termina redirigido, ¿correcto? – Pluc

49

Se puede hacer de esta manera también:

filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
        {{"controller", "Home"}, {"action", "Index"}}); 
29

Crear una clase separada,

public class RedirectingAction : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext context) 
     { 
     base.OnActionExecuting(context); 

     if (CheckUrCondition) 
     { 
      context.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "Home", 
       action = "Index" 
      })); 
     } 
     } 
    } 

Entonces, Cuando se crea un controlador, llamar a esta anotación como

[RedirectingAction] 
public class TestController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

Prefiero este * objeto anónimo para el constructor 'RouteValueDictionary' * ya que refleja el enrutamiento en otro lugar en MVC. +1 –

+0

¡Esto es brillante! gracias – Johny

2

I f el controlador redirigido hereda del mismo baseController donde reemplazamos el método OnActionExecuting porque causa un bucle recursivo. Supongamos que redirigirlo a iniciar sesión acción del controlador de la cuenta, entonces la acción de acceso llamará OnActionExecuting método y redirige a la misma acción de acceso y otra vez ... Por lo tanto, debe aplicarse una marca en OnActionExecuting método para comprobar capear la solicitud procede de la mismo controlador, si es así, no redirija su acción de inicio de sesión nuevamente. Aquí está el código:

protected override.

void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    try 
    { 
     some condition ... 
    } 
    catch 
    { 
     if (filterContext.Controller.GetType() !=  typeof(AccountController)) 
     { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } }); 
     } 
    } 
} 
+1

try { int CompanyId = UserContext.Company.CompanyId; } { captura si (filterContext.Controller.GetType()! = Typeof (AccountController)) { filterContext.Result = new RedirectToRouteResult ( nueva RouteValueDictionary {{ "controlador", "Cuenta"}, { "acción ", "Iniciar sesión" } }); } } –

+0

buena captura abdul, gracias – HolloW

Cuestiones relacionadas