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 修正)
今回、参考にしたサイトは以下の通りです。