una - Redirigir al controlador y la acción especificados en el filtro de acción asp.net mvc
retornar a otra vista mvc (3)
He escrito un filtro de acción que detecta una nueva sesión e intenta redirigir al usuario a una página informándoles de 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?
EDIT: la pregunta original fue sobre cómo detectar el cierre de la sesión, y luego redirigir automáticamente a un controlador y una acción especificados. 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 caducidad de la sesión que se encuentra here . Luego, de alguna forma, quería especificar el combo controlador / acción para obtener una URL de redireccionamiento, que encontré muchos ejemplos 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);
}
}
En lugar de obtener una referencia a HttpContent y redireccionar directamente en ActionFilter, puede establecer que el resultado del contexto del filtro sea un RedirectToRouteResult. Es un poco más limpio y mejor para las pruebas.
Me gusta esto:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if(something)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {{ "Controller", "YourController" },
{ "Action", "YourAction" } });
}
base.OnActionExecuting(filterContext);
}
Llame a RedirectToAction usando esta sobrecarga :
protected internal RedirectToRouteResult RedirectToAction(
string actionName,
RouteValueDictionary routeValues
)
En Action Filters, la historia es un poco diferente. Para un buen ejemplo, mira aquí:
http://www.dotnetspider.com/resources/29440-ASP-NET-MVC-Action-filters.aspx