ASP.NET MVC で コントローラー名、アクション名 の 取得

2 件のコメント

RouteData を利用して、リクエストされた コントローラー名 および アクション名 を取得する方法です。

コントローラー名、アクション名 を 取得する方法の基本

サンプルコード

var routeData = System.Web.Routing.RouteTable.Routes.GetRouteData(httpContext);
var controllerName = routeData.Values["controller"].ToString();
var actionName = routeData.Values["action"].ToString();

説明

RouteDataインスタンス の Values プロパティ はハッシュ配列になっています。 このハッシュ配列において、"controller" キーの値が コントローラー名、"action" キーの値が アクション名となっています。 ("controller" および "action" の文字列は固定文字列のようです。)

リクエストされたコントローラー名、アクション名の取得は、RouteDataクラス の インスタンス をいかに取得するかがポイントになります。 以下のサンプルコードでは、状況に応じて RouteData インスタンス の取得方法が変わっています。

※上記サンプルコードでは "httpContext" に対して何も記述がありませんが、現在実行中の "HttpContextBase" を指定します。

コントローラー の アクションメソッド内 で 取得 する サンプルコード

サンプルコード

public class HomeController : Controller
{
    //
    // GET: /Home/Index
    public ActionResult Index()
    {
        // コントローラー名、アクション名の取得
        var controllerName = this.RouteData.Values["controller"].ToString();
        var actionName = this.RouteData.Values["action"].ToString();

        return View();
    }
}

説明

Controller クラスを継承したクラス内で利用する場合、RouteDataインスタンス がプロパティに既に存在しているので、そのまま利用します。

ヘルパークラス の 拡張メソッド内 で 取得 する サンプルコード

サンプルコード

public static class SampleExtensions
{
    public static string GetNormalizedRequestUrl(this HtmlHelper helper)
    {
        // HttpContextBase インスタンス の取得
        var httpContext = helper.ViewContext.HttpContext;

        // RouteData および コントローラー名、アクション名、クエリ文字列 の取得
        var routeData = helper.RouteCollection.GetRouteData(httpContext);
        var controllerName = routeData.Values["controller"].ToString();
        var actionName = routeData.Values["action"].ToString();
        var queryString = httpContext.Request.QueryString.ToString();

        // クエリ有無によってURL生成方法を変更
        if (string.IsNullOrEmpty(queryString))
        {
            return string.Format("{0}/{1}", controllerName, actionName);
        }
        else
        {
            return string.Format("{0}/{1}?{2}", controllerName, actionName, queryString);
        }
    }
}

説明

ヘルパークラス では RouteDataインスタンス が直接利用できないため、取得してくる必要があります。 HttpContextBaseインスタンス を利用して RouteCollection.GetRouteData( HttpContextBase httpContext ) を利用して RouteDataインスタンス 取得します。

カスタムフィルター の メソッド内 で 取得 する サンプルコード

サンプルコード

public class SampleAttribute: FilterAttribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // RouteData および コントローラー名、アクション名 の 取得
        ////var routeData = System.Web.Routing.RouteTable.Routes.GetRouteData(filterContext.HttpContext);
        var routeData = filterContext.RouteData;
        var controllerName = routeData.Values["controller"].ToString();
        var actionName = routeData.Values["action"].ToString();
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
}

説明

カスタムフィルター では RouteDataインスタンス が直接利用できないため、取得してくる必要があります。 まず、RouteTableクラス の Routes static プロパティ から RouteCollection を取得します。 次に、RouteCollection.GetRouteData( HttpContextBase httpContext ) を利用して RouteDataインスタンス 取得します。
ActionExecutedContext のプロパティに RouteData が存在しているのでそちらをそのまま利用します。(2013/06/25 修正)

今回、参考にしたサイトは以下の通りです。

  1. フィルター中ですが、ActionExecutedContextやActionExecutingContextの基底クラスのControllerContextでRouteDataが公開されてるので、
    以下のように取得できませんか? MVC4だと取れるようです

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
    var routeData = filterContext.RouteData;
    }

    返信削除
    返信
    1. masurawo さん、ご指摘ありがとうございます。
      ご指摘のコードを MVC 3.5 で実行して取得できたので、本文とコードを修正しました。
      MVC 4 は入れていないので分かりませんが… MSDN には RouteData が取得できる記載がありました。
      ActionExecutedContext クラス

      削除