如何重定向从onactionexecution在基础控制器?

我已经尝试了两种方法:Response.Redirect()不做任何事情,以及调用一个新的方法内部的基本控制器返回一个ActionResult,并有它返回RedirectToAction()…这两种方法都不起作用。

我怎么能做一个重定向从onactionexecution方法?

105725 次浏览
 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"
}));
}
}
}
< p >, 在创建控制器时,将此注释称为

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

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

... 因此,我们应该应用check in 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" }
});
}
}
}