180 votes

Comment rediriger à partir de OnActionExecuting dans le contrôleur de base ?

J'ai essayé deux méthodes : Response.Redirect() qui ne fait rien, ainsi que d'appeler une nouvelle méthode dans le contrôleur de base qui renvoie un ActionResult et de lui faire renvoyer RedirectToAction()... aucune de ces méthodes ne fonctionne.

Comment faire une redirection à partir de la méthode OnActionExecuting ?

355voto

womp Points 71924
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }

53voto

Randy Burden Points 1578

On peut aussi le faire de cette façon :

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary
    {
        {"controller", "Home"},
        {"action", "Index"}
    }
);

35voto

K.Kirivarnan Points 347

Créez une classe distincte,

    public class RedirectingAction : ActionFilterAttribute
    {
      public override void OnActionExecuting(ActionExecutingContext context)
      {
        base.OnActionExecuting(context);

        if (CheckUrCondition)
        {
            context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Index"
            }));
        }
      }
   }

Alors, Lorsque vous créez un contrôleur, appelez cette annotation en tant que

[RedirectingAction]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

3voto

abdul hameed Points 71

Si le contrôleur redirigé hérite de la même baseController où nous remplaçons le OnActionExecuting provoque une boucle récursive. Supposons que nous le redirigeons vers l'action de connexion du contrôleur de compte, alors l'action de connexion appellera OnActionExecuting et redirigé vers la même action de connexion encore et encore

... Nous devrions donc appliquer un contrôle dans OnActionExecuting pour vérifier si la requête provient du même contrôleur. Si c'est le cas, il ne faut pas rediriger l'action de connexion à nouveau :

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
   try
   {
      // some condition ...
   }
   catch
   {
      if (filterContext.Controller.GetType() != typeof(AccountController))
      {
         filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary {
              { "controller", "Account" }, 
              { "action", "Login" } 
         });
      }
   }
}

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