web-dev-qa-db-fra.com

Suivre la page active en cours ou comment obtenir les noms de contrôleur et d'action dans une vue

Je suis nouveau dans ASP.NET Core. J'ai un menu de navigation et j'aimerais suivre l'élément actif . Mon idée est d'utiliser les noms d'action et de contrôleur comme touches de navigation:

 enter image description here

le problème est que je ne sais pas comment obtenir l'action et le nom du contrôleur dans la vue _Layout.cshtml ...

J'ai essayé le ViewContext.ActionDescriptor.DisplayName mais il rend quelque chose comme ceci MyApp.Controllers.RecordsController.Index (MyApp)

Je préférerais plutôt obtenir quelque chose comme ceci: 

<script>$("li#@(Controller.Name)-@(Action.Name)")).addClass("active");</script>
8
Serge

Utilisation

var controller = ViewContext.RouteData.Values["Controller"];
var action = ViewContext.RouteData.Values["Action"];

<script>
$("li#@(ViewContext.RouteData.Values["Controller"])-@(ViewContext.RouteData.Values["Action"])")).addClass("active");
</script>

PS: Utilisez ToLower () si nécessaire

ViewContext.RouteData.Values["Action"].ToString().ToLower();

Aussi, vous pouvez activer votre menu par bloc de style

<style>
li#@(ViewContext.RouteData.Values["Controller"])-@(ViewContext.RouteData.Values["Action"]) {
//add some style
}
</style>
28
itikhomi

Avec Net Core 2.0 pour les pages de rasoir, vous pouvez utiliser comme ceci

var rv = ViewContext.RouteData.Values;
string page = $"{rv["page"]}".ToLowerInvariant();

Sur les tags

<li class="@(page == "/index" ?  "active" : "")"><a asp-page="/Index" >Home</a></li>
8
Ravi Selvaraj

Vous pouvez obtenir ce côté serveur si vous combinez cette réponse avec ce qui suit.

Quelque part dans votre vue.

@{
    var rv = ViewContext.RouteData.Values;
    var id = $"{rv["Controller"]}-{rv["Action"]}".ToLowerInvariant();
}

Sur chaque <li>.

<li class-conditional-active="@(id == "records-index")">...</li>
1
benembery