特定のアクションが呼ばれる前にリダイレクトするには

動作環境

ASP.NET MVC
  • ASP.NET MVC 3
  • ASP.NET MVC 4
  • ASP.NET MVC 5

動作確認環境

ASP.NET MVC ASP.NET MVC 4

内容

ASP.NET MVC で構築したサイトにアクセスすると、URL とルーティングによって対応するコントローラーのアクションが呼ばれますが、状況によっては対応するアクションが呼ばれる前に別なアクションや他のページにリダイレクトさせたい場合があると思います。

各アクションでリダイレクトさせるなら「RedirectResult」や「RedirectToRouteResult」を使えば解決しますが、各アクションが呼ばれる前に共通的にリダイレクトさせたい場合は「Controller.OnActionExecuting」オーバーライドメソッドが使えます。このメソッドは各アクションが呼ばれる前に処理されるメソッドです。

「Controller.OnActionExecuting」メソッドでリダイレクトさせたい場合は以下のように記述します。

public class MyController : Controller
{
  // 各アクションが呼ばれる前に呼ばれるメソッド
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    if (リダイレクトさせる条件)
    {
      filterContext.Result = new RedirectResult(url);
      return;
    }
  }
}

「ActionExecutingContext.Result」に URL を指定した RedirectResult を設定すると、指定した URL にリダイレクトします。if 文で分岐しない場合は対象のコントローラーに属するすべてのアクションに対してリダイレクトが実行されます。

また、各 Controller クラスの基本クラスに共通の Controller クラスを設定し、そこに「OnActionExecuting」メソッドを実装すれば複数の Controller クラスで処理を共有できるようになります。

「ActionExecutingContext.Result」は型が ActionResult ですので、「RedirectToRouteResult」クラスや「Controller.RedirectToAction」メソッドなども使用することができます。