我尝试了两种方法: Response.Redirect() 什么都不做,以及在基本控制器内部调用一个返回 ActionResult 并让它返回 RedirectToAction() 的新方法......这些都不起作用。
如何从 OnActionExecuting 方法进行重定向?
我尝试了两种方法: 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
方法来检查请求是否来自同一个控制器,如果是这样,那么不要再次重定向它登录操作。这是代码:
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" }
});
}
}
}