44 votes

Redirection vers un contrôleur et une action spécifiés dans un 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 n'arrive pas à comprendre comment faire en sorte qu'il redirige vers un contrôleur/action combinée dans un filtre d'action. Je n'arrive qu'à trouver comment rediriger vers une url spécifique. Existe-t-il un moyen direct de rediriger vers un contrôleur/un combo d'action dans un filtre d'action en mvc2 ?

91voto

Richard Points 14490

Plutôt que d'obtenir une référence à HttpContent et de rediriger directement dans l'ActionFilter, vous pouvez définir le résultat du contexte du filtre comme étant un RedirectToRouteResult. C'est un peu plus propre et mieux 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 manière de détecter la déconnexion de la session, puis de rediriger automatiquement vers un contrôleur et une action spécifiques. La question s'est avérée beaucoup plus utile sous sa forme actuelle cependant.


J'ai fini par utiliser une combinaison d'éléments pour atteindre cet objectif.

Le premier est le filtre d'expiration de session trouvé aquí . Ensuite, je voulais trouver un moyen de spécifier la combinaison contrôleur/action pour obtenir une URL de redirection, et j'ai trouvé de nombreux exemples de cette méthode. aquí . A la fin, j'ai trouvé 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

Appelez RedirectToAction en utilisant cette surcharge :

protected internal RedirectToRouteResult RedirectToAction(
    string actionName,
    RouteValueDictionary routeValues
)

Pour Action Filters, 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