ベースコントローラのOnActionExecutingからリダイレクトする方法は?


185

私は2つの方法を試しました:何もしないResponse.Redirect()、およびActionResultを返し、RedirectToAction()を返す新しいメソッドを呼び出します...これらの作業のいずれも行いません。

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

回答:


363
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }

79
代わりにnew RedirectResult(url)を使用することもできますnew RedirectToAction(string action, string controller)。これは、回答を投稿した後にMVCに追加された可能性があります。あなたの解決策はとにかく私を正しい軌道に乗せました。
Manfred

3
@Pluc-OnActionExecutingが最初に発生します。context.Resultを設定すると、アクションが実行される前にリダイレクトが行われます。(個人的なテスト/デバッグによって検証されています。)
James

39
@Manfred注、割り当ては、方法(無しに行われるべきであるnew)RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
cederlof

1
@Manfred私はあなたがRedirectToActionを新しくしないことを追加したかっただけです。それはちょうどfilterContext.Result = RedirectToAction(..)だ
Sinaesthetic

4
「RedirectToAction」という名前は現在のコンテキストに存在しませんか?
Dan Hastings

56

次の方法でも行うことができます。

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

35

別のクラスを作成し、

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

MVCの他の場所でルーティングをミラーリングするため、RouteValueDictionaryコンストラクターにはこの匿名オブジェクトを使用します。+1
コーディング終了

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

1
{int CompanyId = UserContext.Company.CompanyId;を試してください。}キャッチ{if(filterContext.Controller.GetType()!= typeof(AccountController)){filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary {{"controller"、 "Account"}、{"action"、 "Login"}} ); }}
abdulが2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.