Obtenez le contrôleur actuel en vue


127

J'ai un View - _Editqui habite News M/V/C.

Je réutilise le V/Mvia le CategoryControllercomme:

return PartialView("/Views/News/_Edit.cshtml", model);

Comment View - _Editpuis-je alerter le nom du contrôleur depuis le?

Quand je:

alert('@ViewContext. RouteData.Values["controller"].ToString()');

La valeur est: News Cependant, l'URL est:/Category/foobar

Existe-t-il un moyen 'Category'd'alerter la valeur ? Merci


vous n'avez pas de NewsController?
chasseur

Veuillez publier votre action methodqui charge le partialviewet ce controllerqui methodexiste dans.
hunter

Réponses:


193

J'ai mis ceci dans ma vue partielle:

@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()

dans le même genre de situation que vous décrivez, et il montre le contrôleur décrit dans l'URL (Catégorie pour vous, Produit pour moi), au lieu de l'emplacement réel de la vue partielle.

Utilisez donc plutôt cette alerte:

alert('@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()');

25
La réponse ci-dessous par Palpie est un raccourci (plus facile à retenir):@ViewContext.RouteData.Values["controller"]
Laoujin

6
Juste un fyi, vous n'avez pas besoin d'obtenir HttpContext.Current. Requestest disponible directement.
Serj Sagan du

Est-il possible d'obtenir le nom complet de la classe du contrôleur, y compris l'espace de noms? Ce serait également cool de pouvoir afficher le nom de la vue.
Johncl

3
btw, ["action"]fonctionne si vous voulez le nom de la méthode d'action.
Zapnologica le

117

Je le fais comme ça, mais ce n'est peut-être que ASP.NET MVC 4

@ViewContext.RouteData.Values["controller"]

12
Gardez à l'esprit que votre solution renverra le contrôleur en cours d'exécution. Par conséquent, si un navigateur fait une demande pour ControllerA et ControllerA rend une vue partielle de ControllerB, votre solution renverra le nom de ControllerB, tandis que la solution Nicholas Sizer renverra le nom de ControllerA.
Thomas CG de Vilhena

Doit être acceptée comme la meilleure réponse. Cela fonctionne toujours dans ASP.NET Core 2.2
Tom

21

Créez la classe de base pour tous les contrôleurs et mettez ici l'attribut de nom:

public abstract class MyBaseController : Controller
{
    public abstract string Name { get; }
}

En vue

@{
    var controller = ViewContext.Controller as MyBaseController;
    if (controller != null)
    {
       @controller.Name
    }
}

Exemple de contrôleur

 public class SampleController: MyBaseController 
    { 
      public override string Name { get { return "Sample"; } 
    }

Veuillez expliquer comment la Namepropriété est définie?
ErikE

13

Autre moyen d'obtenir le nom actuel du contrôleur dans View

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

5

Utilisez simplement:

ViewContext.Controller.GetType().Name

Cela vous donnera le nom complet du contrôleur


2

Vous êtes toujours dans le contexte de votre CategoryControllermême si vous chargez un PartialViewdepuis votre Views/Newsdossier.


0

Vous pouvez utiliser l'un des codes ci-dessous pour obtenir le nom du contrôleur

@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();

Si vous utilisez MVC 3, vous pouvez utiliser

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.