如何从基本控制器中的OnActionExecuting重定向?

时间:2010-07-09 16:47:54

标签: c# asp.net-mvc onactionexecuting

我尝试了两种方法:Response.Redirect()不执行任何操作,以及在基本控制器内部调用返回ActionResult的新方法,并让它返回RedirectToAction()......这些都不起作用。< / p>

如何从OnActionExecuting方法进行重定向?

4 个答案:

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