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 修正)
今回、参考にしたサイトは以下の通りです。
- ASP.NET-MVC . How to get the controller name from an url?
- RouteData クラス
- RouteCollection クラス
- RouteTable クラス
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!