RouteData を利用して、リクエストされた コントローラー名 および アクション名 を取得する方法です。
コントローラー名、アクション名 を 取得する方法の基本
サンプルコード
1 2 3 | 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" を指定します。
コントローラー の アクションメソッド内 で 取得 する サンプルコード
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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
インスタンス がプロパティに既に存在しているので、そのまま利用します。
ヘルパークラス の 拡張メソッド内 で 取得 する サンプルコード
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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
インスタンス 取得します。
カスタムフィルター の メソッド内 で 取得 する サンプルコード
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 修正)
今回、参考にしたサイトは以下の通りです。
- ASP.NET-MVC . How to get the controller name from an url?
- RouteData クラス
- RouteCollection クラス
- RouteTable クラス
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!