196

我尝试了两种方法: Response.Redirect() 什么都不做,以及在基本控制器内部调用一个返回 ActionResult 并让它返回 RedirectToAction() 的新方法......这些都不起作用。

如何从 OnActionExecuting 方法进行重定向?

4

4 回答 4

379
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }
于 2010-07-09T16:51:47.030 回答
61

也可以这样做:

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary
    {
        {"controller", "Home"},
        {"action", "Index"}
    }
);
于 2011-08-22T21:00:47.707 回答
38

创建一个单独的类,

    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"
            }));
        }
      }
   }

然后,当您创建控制器时,将此注释称为

[RedirectingAction]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}
于 2011-12-13T10:31:49.267 回答
3

如果重定向的控制器继承自baseController我们覆盖该OnActionExecuting方法的相同位置,则会导致递归循环。假设我们将其重定向到帐户控制器的登录动作,那么登录动作将调用OnActionExecuting方法并一次又一次地重定向到相同的登录动作

...所以我们应该应用一个签入OnActionExecuting方法来检查请求是否来自同一个控制器,如果是这样,那么不要再次重定向它登录操​​作。这是代码:

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" } 
         });
      }
   }
}
于 2016-07-01T06:36:29.700 回答