2009-05-20 22 views
6

Pregunta simple. ¿Cómo hago para anular el método OnResultExecuting en mi Controlador y forzar un ActionResult diferente en su lugar?asp .net mvc OnResultExecuting modify filterContext Resultado

El código de muestra está a continuación. Actualmente el ActionResutl original continúa ejecutándose y mi nuevo RedirectResult se ignora.

RedirectResult redirectResult = new RedirectResult("http://www.google.com"); 
filterContext.Result = redirectResult; 
base.OnResultExecuting(filterContext); 

Respuesta

9

Sería posible si anula el método OnActionExecuted.

Ejemplo:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     filterContext.Result = new RedirectResult("http://google.com"); 
     base.OnActionExecuted(filterContext); 
    } 
1

que necesitaba para redirigir a partir OnActionExecuting y terminó haciendo esto y funcionó:

filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
        {{"controller", "Base"}, {"action", "Error"}, {"errorMessage", errorMessage}}); 
6

quería saber exactamente lo mismo. He buscado en Google y encontré su pregunta más otras y todas las respuestas parecen ser las mismas. Use el método IActionFilter.OnActionExecuted.

Sin embargo, esa no es realmente una respuesta, es más una solución, ya que @ randy-burden sugiere que puede modificar/reemplazar un resultado de acción RedirectToRouteResult en el filtro de resultados. Entonces, ¿por qué no un resultado de acción RedirectRoute?

Si realmente quiere redirct a una URL específica dentro del método IResultFilter.OnResultExecuting a continuación, puede hacer cualquiera de los siguientes:

RedirectResult redirectResult = new RedirectResult("http://www.google.com"); 
filterContext.Result = redirectResult; 
filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext); 
filterContext.Cancel = true; 
base.OnResultExecuting(filterContext); 

O

filterContext.HttpContext.Response.RedirectLocation = "http://www.google.com"; 
filterContext.HttpContext.Response.StatusCode = 302; 
filterContext.Cancel = true; 
base.OnResultExecuting(filterContext); 

En la primera opción se está ejecutando de forma manual el RedirectResult y al hacer filterContext.Cancel = true le está diciendo a framework que no necesita que se ejecute el filterContext.Result. En la segunda opción, esencialmente haces lo mismo pero, en lugar de tener que RedirectResult configure la respuesta de Http, lo haces tú mismo.

En mi caso, quería anexar un parámetro de consulta adicional a la url de redirección y decirle al framework que quería cancelar el resultado de la acción de redireccionamiento y redirigir de todos modos parecía un poco incorrecto, pero funciona.

1

Usted sólo puede hacer esto si está utilizando MVC5

public void OnResultExecuting(ResultExecutingContext filterContext) 
{ 
    filterContext.HttpContext.Response.Redirect("http://www.google.com"); 
} 
Cuestiones relacionadas