2009-09-29 19 views
39

He escrito un filtro de acción que detecta una nueva sesión e intenta redirigir al usuario a una página que le informa que esto ha sucedido. El único problema es que no puedo descifrar cómo redirigirlo a un combo controlador/acción en un filtro de acción. En cambio, solo puedo descubrir cómo redirigir a una URL específica. ¿Hay una forma directa de redirigir a un combo controlador/acción en un filtro de acción en mvc2?Redireccionando al controlador especificado y a la acción en asp.net filtro de acción mvc

Respuesta

87

En lugar de obtener una referencia a HttpContent y redirigir directamente en la ActionFilter se puede establecer el resultado del contexto filtro para ser un RedirectToRouteResult. Es un poco más limpio y mejor para las pruebas.

De esta manera:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if(something) 
    { 
     filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary {{ "Controller", "YourController" }, 
             { "Action", "YourAction" } }); 
    } 

    base.OnActionExecuting(filterContext); 
} 
+1

Me dolía la cabeza, ahora no es así. Gracias – jolySoft

+3

Esta es una respuesta mucho más apropiada que la mía. Esta fue mi primera pregunta sobre MVC y hoy respondería de esta manera. –

4

llamada RedirectToAction usando this overload:

protected internal RedirectToRouteResult RedirectToAction(
    string actionName, 
    RouteValueDictionary routeValues 
) 

En Acción Filtros, la historia es un poco diferente. Para un buen ejemplo, ver aquí:

http://www.dotnetspider.com/resources/29440-ASP-NET-MVC-Action-filters.aspx

+0

Eso es un buen lugar para buscar la reorientación de la acción de un filtro (1), pero realmente quiero especificar el combo controlador/acción para mi filtro. Tampoco quería simplemente concatenar cadenas en caso de enrutamiento personalizado, pero terminé encontrando algo que podría ayudar. Ver mi respuesta –

17

EDIT: La pregunta original sobre cómo detectar la sesión de cierre de sesión, y luego automáticamente redirigir a un controlador y acción especificada. Sin embargo, la pregunta resultó mucho más útil, ya que es la forma actual.


Terminé usando una combinación de elementos para lograr este objetivo.

Primero es el filtro de expiración de la sesión encontrado here. Entonces, de alguna forma, quería especificar el combo controlador/acción para obtener una URL de redireccionamiento, que encontré con muchos ejemplos de here. Al final se me ocurrió esto:

public class SessionExpireFilterAttribute : ActionFilterAttribute 
{ 
    public String RedirectController { get; set; } 
    public String RedirectAction { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpContext ctx = HttpContext.Current; 

     if (ctx.Session != null) 
     { 
      if (ctx.Session.IsNewSession) 
      { 
       string sessionCookie = ctx.Request.Headers["Cookie"]; 
       if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        UrlHelper helper = new UrlHelper(filterContext.RequestContext); 
        String url = helper.Action(this.RedirectAction, this.RedirectController); 
        ctx.Response.Redirect(url); 
       } 
      } 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 
+7

Si desea que esto sea más comprobable, creo que simplemente puede establecer filterContext.Result en RedirectResult, en lugar de redirigirlo explícitamente. El resultado neto es que MVC aún realizará la redirección, pero de esa manera puede escribir pruebas unitarias que invocan manualmente OnActionExecuting() y luego afirman contra filterContext.Result. –

Cuestiones relacionadas