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/#navbar
La 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.
<ul class="nav navbar-nav">
<li class="active">@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
É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 valeurs Action
et Controller
. Nous pourrions construire sur ce que vous avez actuellement avec quelque chose comme ceci:
<ul class="nav navbar-nav">
<li class="@(ViewContext.RouteData.Values["Action"].ToString() == "Index" ? "active" : "")">@Html.ActionLink("Home", "Index", "Home")</li>
<li class="@(ViewContext.RouteData.Values["Action"].ToString() == "About" ? "active" : "")">@Html.ActionLink("About", "About", "Home")</li>
<li class="@(ViewContext.RouteData.Values["Action"].ToString() == "Contact" ? "active" : "")">@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
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!
public static string IsSelected(this HtmlHelper html, string controllers = "", string actions = "", string cssClass = "selected")
{
ViewContext viewContext = html.ViewContext;
bool isChildAction = viewContext.Controller.ControllerContext.IsChildAction;
if (isChildAction)
viewContext = html.ViewContext.ParentActionViewContext;
RouteValueDictionary routeValues = viewContext.RouteData.Values;
string currentAction = routeValues["action"].ToString();
string currentController = routeValues["controller"].ToString();
if (String.IsNullOrEmpty(actions))
actions = currentAction;
if (String.IsNullOrEmpty(controllers))
controllers = currentController;
string[] acceptedActions = actions.Trim().Split(',').Distinct().ToArray();
string[] acceptedControllers = controllers.Trim().Split(',').Distinct().ToArray();
return acceptedActions.Contains(currentAction) && acceptedControllers.Contains(currentController) ?
cssClass : String.Empty;
}
Fonctionne avec .NET Core:
public static string IsSelected(this IHtmlHelper htmlHelper, string controllers, string actions, string cssClass = "selected")
{
string currentAction = htmlHelper.ViewContext.RouteData.Values["action"] as string;
string currentController = htmlHelper.ViewContext.RouteData.Values["controller"] as string;
IEnumerable<string> acceptedActions = (actions ?? currentAction).Split(',');
IEnumerable<string> acceptedControllers = (controllers ?? currentController).Split(',');
return acceptedActions.Contains(currentAction) && acceptedControllers.Contains(currentController) ?
cssClass : String.Empty;
}
Exemple d'utilisation:
<ul>
<li class="@Html.IsSelected(actions: "Home", controllers: "Default")">
<a href="@Url.Action("Home", "Default")">Home</a>
</li>
<li class="@Html.IsSelected(actions: "List,Detail", controllers: "Default")">
<a href="@Url.Action("List", "Default")">List</a>
</li>
</ul>