如何从基本控制器的OnActionExecutingredirect?

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

我怎样才能从OnActionExecuting方法做redirect?

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

也可以这样做:

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

创build一个单独的类,

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

然后,当你创build一个控制器时,把这个注解称为

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

如果redirect的控制器从同一个baseControllerinheritance我们重写OnActionExecuting方法导致recursion循环。 假设我们将其redirect到账户控制器的login动作,那么login动作将会调用OnActionExecuting方法,并且一次又一次被redirect到相同的login动作。所以我们应该在OnActionExecuting方法中应用一个检查来检查天气请求是否来自相同的如果是这样,那么不要再redirect它的login行为。 这里是代码:

保护覆盖。

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