web-dev-qa-db-ja.com

かみそりからコントローラー名を取得する

私は簡単なものを手に入れるのが難しいようです。私の見解では、Razorを使用して、現在のコントローラーの名前を取得したいと思います。たとえば、私がここにいる場合:

http://www.example.com/MyController/Index

Razor式からコントローラー名MyControllerを取得するにはどうすればよいですか:

@* Obviously this next line doesn't work
    @Controller.Name
*@

私はMVCが初めてなので、これが明らかな答えである場合は、私に悪口を言わないでください。

42
Icemanind
@{ 
    var controllerName = this.ViewContext.RouteData.Values["controller"].ToString();
}

OR

@{ 
    var controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
}
76
Koti Panga

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サイトのすべてのページについて、リンクが準備され、SiteMenuPartialLayoutControllerというアクションからビューに渡されます。

したがって、/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();
}
37
Extragorey
@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();

MVC 3

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue

MVC 4.5

@ViewContext.RouteData.Values["controller"].ToString();
6
Sathish

ToString()呼び出しの必要性を取り除くには

@ViewContext.RouteData.GetRequiredString("controller")
3

また、完全なコントローラー名(「コントローラー」で終わる)を取得したい場合は、次を使用できます。

ViewContext.Controller.GetType().Name
1
Robert