2020/11/09
今回は技術系で「ASP.NET MVC」に関するちょっとしたお話です。
現在リクエストされているコントローラ名とアクション名を取得したいことがあります。特に外部プログラムに処理を投げるときに、現在どの画面か判断できる材料があると便利です。
さっさと結論を書きますが、
・現在の名前を取得する場合はControllerContext.RouteData.Values
・子アクションで親アクションの名前を取得する場合はControllerContext.ParentActionViewContext
のRouteData
から取得できます!
環境
・ASP.NET MVC
5.2.4
取得方法
現在のコントローラ/アクション名はControllerContext.RouteData.Values
から取得できます。
ControllerContext
はSystem.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>
コントローラ名やアクション名を取得したい場合は参考にしてみてください。