web-dev-qa-db-fra.com

Obtention du nom du contrôleur à partir du rasoir

Il me semble que j'ai du mal à obtenir quelque chose qui devrait être facile. De mon point de vue, en utilisant Razor, je voudrais obtenir le nom du contrôleur actuel. Par exemple, si je suis ici:

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

Comment puis-je obtenir le nom du contrôleur, MyController à partir d'une expression Razor:

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

Je suis nouveau sur MVC, donc si c'est une réponse évidente, ne m'attaquez pas trop mal.

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

OR

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

Un addendum à la réponse de Koti Panga: les deux exemples qu'il a fournis sont pas équivalents.

Cela renverra le nom du contrôleur gérant la vue où ce code est exécuté:

var handlingController = this.ViewContext.RouteData.Values["controller"].ToString();

Et cela renverra le nom du contrôleur demandé dans l'URL:

var requestedController = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();

Bien que ceux-ci soient certainement les mêmes dans la plupart des cas, dans certains cas, vous pouvez être dans une vue partielle appartenant à un autre contrôleur et vouloir obtenir le nom du contrôleur "plus haut" dans la chaîne, auquel cas le une deuxième méthode est requise.

Par exemple, imaginez que vous avez une vue partielle responsable du rendu des liens de menu du site Web. Ainsi, pour chaque page de votre site Web, les liens sont préparés et transmis à la vue à partir d'une action appelée SiteMenuPartial dans LayoutController.

Ainsi, lorsque vous chargez /Home/Index, la page de disposition est récupérée, la méthode SiteMenuPartial est appelée par la page de disposition et SiteMenuPartial.cshtml une vue partielle est retournée. Si, dans cette vue partielle, vous deviez exécuter les deux lignes de code suivantes, elles renverraient les valeurs affichées:

/* 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

Pour supprimer le besoin de ToString() appelez use

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

De plus, si vous souhaitez obtenir le nom complet du contrôleur (avec la fin de "Controller"), vous pouvez utiliser:

ViewContext.Controller.GetType().Name
1
Robert