196

何もしない Response.Redirect() と、ActionResult を返す Base Controller 内で新しいメソッドを呼び出して RedirectToAction() を返すという 2 つの方法を試しました。どちらも機能しません。

OnActionExecuting メソッドからリダイレクトするにはどうすればよいですか?

4

4 に答える 4

379
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }
于 2010-07-09T16:51:47.030 に答える
61

この方法でも実行できます。

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary
    {
        {"controller", "Home"},
        {"action", "Index"}
    }
);
于 2011-08-22T21:00:47.707 に答える
38

別のクラスを作成し、

    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();
    }
}
于 2011-12-13T10:31:49.267 に答える
3

リダイレクトされたコントローラー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" } 
         });
      }
   }
}
于 2016-07-01T06:36:29.700 に答える