私は簡単なものを手に入れるのが難しいようです。私の見解では、Razorを使用して、現在のコントローラーの名前を取得したいと思います。たとえば、私がここにいる場合:
http://www.example.com/MyController/Index
Razor式からコントローラー名MyController
を取得するにはどうすればよいですか:
@* Obviously this next line doesn't work
@Controller.Name
*@
私はMVCが初めてなので、これが明らかな答えである場合は、私に悪口を言わないでください。
@{
var controllerName = this.ViewContext.RouteData.Values["controller"].ToString();
}
OR
@{
var controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
}
Koti Pangaの答えへの補遺:彼が提供した2つの例はnotと同等です。
これにより、このコードが実行されるビューを処理するコントローラーの名前が返されます。
var handlingController = this.ViewContext.RouteData.Values["controller"].ToString();
そして、これはURLで要求されたコントローラーの名前を返します:
var requestedController = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
ほとんどの場合、これらは確かに同じですが、別のコントローラーに属する部分ビューの内部にいて、チェーンのコントローラーの「上位」の名前を取得したい場合があります。 2番目の方法が必要です。
たとえば Webサイトのメニューリンクのレンダリングを担当する部分ビューがあるとします。そのため、Webサイトのすべてのページについて、リンクが準備され、SiteMenuPartial
のLayoutController
というアクションからビューに渡されます。
したがって、/Home/Index
、レイアウトページが取得され、SiteMenuPartial
メソッドがレイアウトページによって呼び出され、SiteMenuPartial.cshtml
部分的なビューが返されます。その部分ビューで、次の2行のコードを実行すると、表示されている値が返されます。
/* Executes at the top of SiteMenuPartial.cshtml */
@{
// returns "Layout"
string handlingController = this.ViewContext.RouteData.Values["controller"].ToString();
// returns "Home"
string requestedController = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
}
@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
MVC 3
@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
MVC 4.5
@ViewContext.RouteData.Values["controller"].ToString();
ToString()
呼び出しの必要性を取り除くには
@ViewContext.RouteData.GetRequiredString("controller")
また、完全なコントローラー名(「コントローラー」で終わる)を取得したい場合は、次を使用できます。
ViewContext.Controller.GetType().Name