我尝试了两种方法:Response.Redirect(),它什么都不做,以及在基本控制器内调用一个返回ActionResult并让它返回RedirectToAction()的新方法......这些都不起作用 .
如何从OnActionExecuting方法进行重定向?
public override void OnActionExecuting(ActionExecutingContext filterContext) { ... if (needToRedirect) { ... filterContext.Result = new RedirectResult(url); return; } ... }
它也可以这样做:
filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { {"controller", "Home"}, {"action", "Index"} } );
创建一个单独的类,
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(); } }
如果重定向的控制器从相同的 baseController 继承,我们覆盖 OnActionExecuting 方法导致递归循环 . 假设我们将其重定向到帐户控制器的登录操作,然后登录操作将调用 OnActionExecuting 方法并再次重定向到相同的登录操作...所以我们应该应用检查 OnActionExecuting 方法来检查请求来自同一天气控制器如果是,那么不要再次重定向它登录操作 . 这是代码:
baseController
OnActionExecuting
受保护的覆盖
void OnActionExecuting(ActionExecutingContext filterContext) { try { some condition ... } catch { if (filterContext.Controller.GetType() != typeof(AccountController)) { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } }); } } }
4 回答
它也可以这样做:
创建一个单独的类,
然后,在创建控制器时,将此注释称为
如果重定向的控制器从相同的
baseController
继承,我们覆盖OnActionExecuting
方法导致递归循环 . 假设我们将其重定向到帐户控制器的登录操作,然后登录操作将调用OnActionExecuting
方法并再次重定向到相同的登录操作...所以我们应该应用检查OnActionExecuting
方法来检查请求来自同一天气控制器如果是,那么不要再次重定向它登录操作 . 这是代码:受保护的覆盖