J'essaie d'ajouter une classe "active" à ma barre de navigation bootstrap dans MVC, mais ce qui suit ne montre pas la classe active lorsqu'elle est écrite comme ceci:
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home", null, new {@class="active"})</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
Cela résout ce qui ressemble à une classe correctement formatée, mais ne fonctionne pas:
<a class="active" href="/">Home</a>
Dans la documentation Bootstrap, il est indiqué que les balises «a» ne doivent pas être utilisées dans la barre de navigation, mais ce qui précède est à mon avis la manière correcte d'ajouter une classe à un Html.ActionLink. Y a-t-il une autre façon (ordonnée) de faire cela?
asp.net
css
asp.net-mvc
twitter-bootstrap
Gillespie
la source
la source
active
classe à l'li
élément, pas lea
. Voir le premier exemple ici: getbootstrap.com/components/#navbarRéponses:
Dans Bootstrap, la
active
classe doit être appliquée à l'<li>
élément et non au<a>
. Voir le premier exemple ici: http://getbootstrap.com/components/#navbarLa façon dont vous gérez votre style d'interface utilisateur en fonction de ce qui est actif ou non n'a rien à voir avec l'
ActionLink
aide d' ASP.NET MVC . C'est la solution appropriée pour suivre la manière dont le framework Bootstrap a été construit.Éditer:
Étant donné que vous réutiliserez probablement votre menu sur plusieurs pages, il serait judicieux de disposer d'un moyen d'appliquer automatiquement cette classe sélectionnée en fonction de la page actuelle plutôt que de copier le menu plusieurs fois et de le faire manuellement.
Le moyen le plus simple consiste simplement à utiliser les valeurs contenues dans
ViewContext.RouteData
, à savoir les valeursAction
etController
. Nous pourrions construire sur ce que vous avez actuellement avec quelque chose comme ceci:Ce n'est pas joli dans le code, mais cela fera le travail et vous permettra d'extraire votre menu dans une vue partielle si vous le souhaitez. Il existe des moyens de le faire d'une manière beaucoup plus propre, mais puisque vous ne faites que commencer, je vais en rester là. Bonne chance pour apprendre ASP.NET MVC!
Modification tardive:
Cette question semble générer un peu de trafic, alors j'ai pensé que je proposerais une solution plus élégante en utilisant une
HtmlHelper
extension.Edit 03-24-2015: J'ai dû réécrire cette méthode pour permettre plusieurs actions et contrôleurs déclenchant le comportement sélectionné, ainsi que la gestion du moment où la méthode est appelée à partir d'une vue partielle d'action enfant, j'ai pensé partager la mise à jour!
Fonctionne avec .NET Core:
Exemple d'utilisation:
la source
Extension:
Usage:
la source
role="presentation"
, ce qui n'est pas du tout approprié pour un menu de navigation principal ( john.foliot.ca/aria-hidden/#pr ). Une liste non ordonnée est tout à fait un conteneur approprié pour un ensemble de liens connexes, car elle les regroupe de manière logique.var str = String.Format("<li role=\"presentation\"{0}>{1}</li>", currentAction.toLower().Equals(action.toLower(), StringComparison.InvariantCulture) && currentController.toLower().Equals(controller.toLower(), StringComparison.InvariantCulture) ? " class=\"active\"" : String.Empty, html.ActionLink(text, action, controller).ToHtmlString() );
J'ai réussi à le faire en ajoutant un paramètre de sac de vue dans asp.net mvc. Ici qu'est-ce que j'ai fait
Ajout d'
ViewBag.Current = "Scheduler";
un paramètre similaire dans chaque pageDans la page de mise en page
Cela a résolu mon problème.
la source
Peut-être un peu tard. Mais j'espère que cela vous aidera.
Et l'utilisation comme suit:
Obtenu une référence de http://www.codingeverything.com/2014/05/mvcbootstrapactivenavbar.html
la source
Je sais que cette question est ancienne, mais j'aimerais simplement ajouter ma voix ici. Je pense que c'est une bonne idée de laisser au contrôleur de la vue le fait de savoir si un lien est actif ou non.
Je définirais simplement une valeur unique pour chaque vue dans l'action du contrôleur. Par exemple, si je voulais activer le lien de la page d'accueil, je ferais quelque chose comme ceci:
Ensuite, à mon avis, j'écrirai quelque chose comme ceci:
Lorsque vous accédez à une autre page, disons Programmes, ViewBag.Home n'existe pas (c'est le cas de ViewBag.Programs); par conséquent, rien n'est rendu, pas même class = "". Je pense que c'est plus propre à la fois pour la maintenabilité et la propreté. J'ai tendance à toujours vouloir laisser la logique hors de vue autant que possible.
la source
Compte tenu de ce que Damith a publié, j'aime penser que vous pouvez simplement vous qualifier actif par le Viewbag.Title (la meilleure pratique consiste à renseigner cela dans vos pages de contenu en permettant à votre
_Layout.cshtml
page de contenir vos barres de liens). Notez également que si vous utilisez des éléments de sous-menu, cela fonctionne également très bien:la source
J'ai modifié la réponse «pas jolie» de dom et l' ai rendue plus moche. Parfois, deux contrôleurs ont les noms d'action en conflit (c'est-à-dire Index), alors je fais ceci:
la source
Vous pouvez essayer ceci: Dans mon cas, je charge le menu à partir de la base de données en fonction de l'accès basé sur les rôles, écrivez le code sur chaque vue quel menu vous souhaitez activer en fonction de votre vue.
la source
Cette solution est simple pour Asp.net MCV 5.
Créez une classe statique, par exemple
Utilitarios.cs
.À l'intérieur de la classe, créez une méthode statique:
appelle comme ça
la source
ASP.NET Core et Bootstrap 4
Réponse la plus à jour
J'ai retravaillé la solution soignée de @crush pour un moyen mis à jour, compatible ASP.NET Core et Bootstrap 4 pour résoudre ce problème basé sur une
IHtmlHelper
méthode d'extension:Usage
la source
ActiveActionLink()
appliquera la classe active à la<li>
:-)Easy ASP.NET Core 3.0 et TagHelpers
Incluez dans votre _ViewImports.cs:
Usage:
la source
Ajouter '.ToString' pour améliorer la comparaison sur ASP.NET MVC
-
la source
@functions { public bool IsActive(string action, string controller) { var actionRoute = ViewContext.RouteData.Values["Action"].ToString(); var controlRoute = ViewContext.RouteData.Values["Controller"].ToString(); return controller.Equals(controlRoute)&& actionRoute.Equals(actionRoute); } }
et l'utilisation:<li class="@(IsActive("Index", "Home")? "active": "")">
Nous pouvons également créer à
UrlHelper
partir de RequestContext que nous pouvons obtenir à partir de MvcHandler lui-même. Par conséquent, je pense que pour quelqu'un qui souhaite conserver cette logique dans les modèles Razor, la manière suivante serait utile:AppCode
.HtmlHelpers.cshtml
Créez un assistant là-dedans:
Ensuite, nous pouvons utiliser nos vues comme ceci:
J'espère que cela aide quelqu'un.
la source
UrlHelper
celle que vous avezController.Url
. La seule chose est que nous ne voulons probablement pas exécuter la créationUrlHelper
pour chaque appel àMenuItem
afin que nous puissions appliquer une coche pour l'enregistrer dans HttpContext Items après le premier appel à l'assistant, donc nous ne le faisons qu'une fois par requête.est possible avec une fonction lambda
puis utilisation
la source
J'ai créé une
HtmlHelper
extension qui ajoute uneActiveActionLink
méthode pour ceux d'entre vous qui veulent ajouter la classe "active" au lien lui-même plutôt que l'<li>
entourant du lien.L'utilisation est la suivante:
la source
la réponse de @dombenoit fonctionne. Bien qu'il introduit du code à maintenir. Vérifiez cette syntaxe:
Remarquez l'utilisation de la
.SetLinksActiveByControllerAndAction()
méthode.Si vous vous demandez ce qui rend cette syntaxe possible, consultez TwitterBootstrapMVC
la source
Je cherchais également une solution et jQuery m'a beaucoup aidé. Tout d'abord, vous devez donner des «identifiants» à vos
<li>
éléments.Après avoir fait cela dans votre page de mise en page, vous pouvez indiquer à jQuery quel
<li>
élément doit être «sélectionné» dans votre vue.Remarque: vous devez avoir
@RenderSection("scripts", required: false)
dans votre page de mise en page, juste avant la</body>
balise pour ajouter cette section.la source
Je voudrais proposer cette solution qui est basée sur la première partie de la réponse de Dom.
Nous définissons d'abord deux variables, "action" et "controller" et les utilisons pour déterminer le lien actif:
Puis:
Maintenant, il semble plus joli et pas besoin de solutions plus complexes.
la source
s'il ne s'affiche pas du tout, la raison en est que vous avez besoin de deux signes @:
MAIS, je pense que vous devrez peut-être avoir la classe active sur la balise "li" et non sur la balise "a". selon la documentation de bootstrap ( http://getbootstrap.com/components/#navbar-default ):
donc votre code sera:
la source
J'espère que cela vous aidera, voici comment votre menu peut être:
Et ajoutez ci-dessous la fonction d'assistance MVC sous la balise html.
J'ai renvoyé la réponse de http://questionbox.in/add-active-class-menu-link-html-actionlink-asp-net-mvc/
la source
J'ai réalisé que ce problème était un problème courant pour certains d'entre nous, j'ai donc publié ma propre solution en utilisant le package nuget. Ci-dessous, vous pouvez voir comment cela fonctionne. J'espère que cela sera utile.
Remarque: ce paquet nuget est mon premier paquet. Donc, si vous voyez une erreur, veuillez donner votre avis. Je vous remercie.
Installez le package ou téléchargez le code source et ajoutez votre projet
Ajoutez vos pages à une énumération
Placez le filtre en haut de votre contrôleur ou action
Et utilisez-le dans votre mise en page d'en-tête comme ceci
Plus d'informations: https://github.com/betalgo/MvcMenuNavigator
la source
Je crois que voici un code plus propre et plus petit pour faire en sorte que le menu sélectionné soit "actif":
la source
J'ai fait la combinaison des réponses ci-dessus et fait ma solution.
Alors..
Tout d'abord, dans le bloc rasoir, créez une variable de chaîne qui contiendra la valeur du nom du contrôleur et l'action appelée par l'utilisateur.
Ensuite, utilisez une combinaison de code HTML et Razor:
Je pense que c'est bien parce que vous n'avez pas besoin d'accéder à "ViewContext.RouteData.Values" à chaque fois pour obtenir le nom du contrôleur et le nom de l'action.
la source
Ma solution à ce problème est
Un meilleur moyen peut être d'ajouter une méthode d'extension Html pour renvoyer le chemin actuel à comparer avec le lien
la source
J'ai fait ça:
Création d'un assistant dans la vue partielle du menu
Ensuite, utilisez-le dans la balise d'ancrage comme ceci:
Mon application n'avait pas de zones mais elle peut également être incluse comme une autre variable dans la fonction d'assistance. Et je devais passer la classe active à la balise d'ancrage à mon avis. Mais
li
peut également être configuré comme ça.la source