2009-09-29 7 views
39

J'ai écrit un filtre d'action qui détecte une nouvelle session et tente de rediriger l'utilisateur vers une page pour l'informer que cela s'est produit. Le seul problème est que je n'arrive pas à comprendre comment le rediriger vers une combinaison contrôleur/action dans un filtre d'action. Je peux au contraire seulement comprendre comment rediriger vers une URL spécifiée. Existe-t-il un moyen direct de rediriger vers un contrôleur/une combinaison d'actions dans un filtre d'action dans mvc2?Redirection vers le contrôleur spécifié et action dans le filtre d'action mvc asp.net

Répondre

87

Plutôt que d'obtenir une référence à HttpContent et rediriger directement dans le 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 ceci:

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

    base.OnActionExecuting(filterContext); 
} 
+1

Ma tête me faisait mal, maintenant ça ne l'est pas. Merci – jolySoft

+3

Ceci est une réponse beaucoup plus appropriée que le mien. C'était ma première question sur MVC et aujourd'hui je répondrais comme ça. –

4

Appel à l'aide RedirectToActionthis overload:

protected internal RedirectToRouteResult RedirectToAction(
    string actionName, 
    RouteValueDictionary routeValues 
) 

dans les filtres d'action, l'histoire est un peu différent. Pour un bon exemple, voir ici:

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

+0

C'est un bon endroit pour chercher pour rediriger dans un filtre d'action (+1), mais je veux vraiment spécifier le combo contrôleur/action à mon filtre. Je ne voulais pas non plus simplement concaténer les chaînes en cas de routage personnalisé, mais j'ai fini par trouver quelque chose qui pourrait m'aider. Vois ma réponse. –

17

EDIT: La question initiale était sur la façon de détecter la session fermeture de session, puis rediriger automatiquement vers un contrôleur spécifique et action. La question s'est avérée beaucoup plus utile que sa forme actuelle cependant.


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

La première est la session expire filter found here. Ensuite, je voulais spécifier le contrôleur/action combo pour obtenir une URL de redirection, ce que j'ai trouvé beaucoup d'exemples de here. 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); 
    } 
} 
+7

Si vous voulez rendre cela plus testable, je crois que vous pouvez simplement définir filterContext.Result à un RedirectResult, plutôt que de rediriger explicitement. Le résultat net est que MVC effectuera toujours la redirection, mais de cette façon, vous pouvez écrire des tests unitaires qui invoquent manuellement OnActionExecuting(), puis s'affirmer contre filterContext.Result. –

Questions connexes