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 ?
Réponses
Trop de publicités?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);
}
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);
}
}
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