我尝试了两种方法:Response.Redirect()不执行任何操作,以及在基本控制器内部调用返回ActionResult的新方法,并让它返回RedirectToAction()......这些都不起作用。< / p>
如何从OnActionExecuting方法进行重定向?
答案 0 :(得分:342)
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
答案 1 :(得分:52)
也可以这样做:
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{"controller", "Home"},
{"action", "Index"}
}
);
答案 2 :(得分:34)
创建一个单独的类
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();
}
}
答案 3 :(得分:3)
如果重定向的控制器继承了我们覆盖baseController
方法的同一OnActionExecuting
导致递归循环。假设我们将其重定向到帐户控制器的登录操作,然后登录操作将调用OnActionExecuting
方法并再次重定向到相同的登录操作
...所以我们应该使用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" } });
}
}
}