45 votes

Redirection vers le contrôleur spécifié et action dans le filtre d'action asp.net mvc

J'ai écrit un filtre d'action qui détecte une nouvelle session et tente de rediriger l'utilisateur vers une page l'informant que cela s'est produit. Le seul problème est que je ne peux pas comprendre comment le rediriger vers un combo contrôleur / action dans un filtre d'action. Au lieu de cela, je peux seulement comprendre comment rediriger vers une URL spécifiée. Existe-t-il un moyen direct de rediriger vers un combo contrôleur / action dans un filtre d'action dans mvc2?

92voto

Richard Points 14490

Plutôt que d'obtenir une référence à HttpContent et de rediriger directement dans ActionFilter, vous pouvez définir le contexte de résultat du filtre sur RedirectToRouteResult. C'est un peu plus propre et meilleur pour les tests.

Comme ça:

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

    base.OnActionExecuting(filterContext);
}
 

17voto

NickLarsen Points 9591

EDIT: La question initiale portait sur la façon de détecter la déconnexion de la session, et ensuite rediriger automatiquement vers un contrôleur spécifié et l'action. La question s'est révélé beaucoup plus utile que la forme actuelle, cependant.


J'ai fini à l'aide d'une combinaison d'éléments pour atteindre cet objectif.

La première est que la session expire filtre trouvé ici. Ensuite, j'ai voulu d'une certaine manière pour spécifier le contrôleur/action combo pour obtenir une URL de redirection, que j'ai trouvé beaucoup d'exemples de ici. En fin de compte, je suis venu avec ceci:

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

5voto

Robert Harvey Points 103562

Appel RedirectToAction à l'aide de cette surcharge:

protected internal RedirectToRouteResult RedirectToAction(
    string actionName,
    RouteValueDictionary routeValues
)

Dans l'Action des Filtres, l'histoire est un peu différente. Pour un bon exemple, voir ici:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X