【问题标题】:How to redirect from OnActionExecuting in Base Controller?如何从基本控制器中的 OnActionExecuting 重定向?
【发布时间】:2011-03-13 23:42:35
【问题描述】:

我尝试了两种方法:Response.Redirect() 什么都不做,以及在基本控制器内部调用一个返回 ActionResult 并让它返回 RedirectToAction() 的新方法......这些都不起作用。

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

【问题讨论】:

    标签: c# asp.net-mvc onactionexecuting


    【解决方案1】:
     public override void OnActionExecuting(ActionExecutingContext filterContext)
     {
        ...
        if (needToRedirect)
        {
           ...
           filterContext.Result = new RedirectResult(url);
           return;
        }
        ...
     }
    

    【讨论】:

    • 你也可以用new RedirectToAction(string action, string controller)代替new RedirectResult(url)。在您发布答案后,这可能已添加到 MVC。无论如何,你的解决方案让我走上了正轨。
    • @Pluc - OnActionExecuting 首先发生。如果您设置 context.Result,那么重定向会在操作执行之前发生。 (通过个人测试/调试验证。)
    • @Manfred 注意,应该对方法进行赋值(没有new) RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
    • @Manfred 我只是想补充一点,您不会新建 RedirectToAction。这只是 filterContext.Result = RedirectToAction(..)
    • 当前上下文中不存在名称“RedirectToAction”??
    【解决方案2】:

    也可以这样做:

    filterContext.Result = new RedirectToRouteResult(
        new RouteValueDictionary
        {
            {"controller", "Home"},
            {"action", "Index"}
        }
    );
    

    【讨论】:

      【解决方案3】:

      创建一个单独的类,

          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();
          }
      }
      

      【讨论】:

      • 我更喜欢 RouteValueDictionary 构造函数的这个 匿名对象,因为它反映了 MVC 中其他地方的路由。 +1
      【解决方案4】:

      如果重定向控制器继承自同一个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" } 
               });
            }
         }
      }
      

      【讨论】:

      • 尝试 { int CompanyId = UserContext.Company.CompanyId; } catch { if (filterContext.Controller.GetType() != typeof(AccountController)) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } } ); } }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多