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

Valamas
la source
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()');
Nicholas Sizer
la source
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"]
Peter Hedberg
la source
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"; } 
    }
Sel
la source
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
Vladimir Savinov
la source
5

Utilisez simplement:

ViewContext.Controller.GetType().Name

Cela vous donnera le nom complet du contrôleur

batspy
la source
2

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

chasseur
la source
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
Sathish
la source