ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【ASP.NET MVC】現在実行しているコントローラとアクションの名前を取得する方法

time 2019/01/05

今回は技術系で「ASP.NET MVC」に関するちょっとしたお話です。
現在リクエストされているコントローラ名とアクション名を取得したいことがあります。特に外部プログラムに処理を投げるときに、現在どの画面か判断できる材料があると便利です。

さっさと結論を書きますが、
・現在の名前を取得する場合はControllerContext.RouteData.Values
・子アクションで親アクションの名前を取得する場合はControllerContext.ParentActionViewContextRouteData
から取得できます!

環境

・ASP.NET MVC
5.2.4

取得方法

現在のコントローラ/アクション名はControllerContext.RouteData.Valuesから取得できます。
ControllerContextSystem.Web.Mvc.Controllerを継承している場合、コントローラメソッド内からアクセスできます。

string controllerName = (string)ControllerContext.RouteData.Values["controller"];
string actionName = (string)ControllerContext.RequestContext.RouteData.Values["action"];

子アクション内から親のコントローラ/アクション名を取得したい場合はControllerContext.ParentActionViewContext.RouteData.Valuesを参照します。

string parentControllerName = (string)ControllerContext.ParentActionViewContext.RouteData.Values["controller"];
string parentActionName = (string)ControllerContext.ParentActionViewContext.RouteData.Values["action"];

ちなみに子アクション自体のコントローラ/アクション名を取得したい場合、前述の「現在のコントローラ/アクション名」の方法で取得できます。

サンプルソース

親アクションと子アクションで現在のコントローラ/アクション名を表示してみます。

【コントローラ】

using System.Web.Mvc;

namespace AzarashiSample01.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.controllerName = (string)ControllerContext.RouteData.Values["controller"];
            ViewBag.actionName = (string)ControllerContext.RequestContext.RouteData.Values["action"];

            return View();
        }

        [ChildActionOnly]
        public ActionResult NameTest()
        {
            ViewBag.childControllerName = (string)ControllerContext.RouteData.Values["controller"];
            ViewBag.childActionName = (string)ControllerContext.RouteData.Values["action"];

            ViewBag.parentControllerName = (string)ControllerContext.ParentActionViewContext.RouteData.Values["controller"];
            ViewBag.parentActionName = (string)ControllerContext.ParentActionViewContext.RouteData.Values["action"];

            return PartialView("ChildTest");
        }
    }
}

【親アクションのビュー】

@{
    ViewBag.Title = "テストページ";
}

<div class="row">
    <div class="col-md-4">
        <h2>親テスト</h2>
        <p>アクション名: @ViewBag.controllerName</p>
        <p>コントローラ名: @ViewBag.actionName</p>

        @Html.Action("NameTest")
    </div>
</div>

【子アクションのビュー】

<h2>子アクションテスト</h2>

<p>アクション名: @ViewBag.childControllerName</p>
<p>コントローラ名: @ViewBag.childActionName</p>

<p>親アクション名:@ViewBag.parentControllerName</p>
<p>親コントローラ名: @ViewBag.parentActionName</p>

コントローラ名やアクション名を取得したい場合は参考にしてみてください。

down

コメントする