web-dev-qa-db-fra.com

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

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. Je peux à la place 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?

43
Nick Larsen

Plutôt que d'obtenir une référence à HttpContent et de rediriger directement dans ActionFilter, vous pouvez définir le résultat du contexte de filtre pour être un 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);
}
90
Richard Garside

EDIT: La question d'origine était de savoir comment détecter la déconnexion de session, puis rediriger automatiquement vers un contrôleur et une action spécifiés. Cependant, la question s'est avérée beaucoup plus utile car elle est actuelle.


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

Le premier filtre d'expiration de session est trouvé ici . Ensuite, je voulais en quelque sorte spécifier le combo contrôleur/action pour obtenir une URL de redirection, que j'ai trouvé de nombreux exemples de ici . En fin de compte, 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);
    }
}
17
Nick Larsen

Appelez RedirectToAction en utilisant cette surcharge :

protected internal RedirectToRouteResult RedirectToAction(
    string actionName,
    RouteValueDictionary routeValues
)

Dans 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

5
Robert Harvey