In Bootstrap muss die active
Klasse auf das <li>
Element und nicht auf das Element angewendet werden <a>
. Das erste Beispiel finden Sie hier: http://getbootstrap.com/components/#navbar
Die Art und Weise, wie Sie mit Ihrem UI-Stil umgehen, basierend darauf, was aktiv ist oder nicht, hat nichts mit dem ActionLink
Helfer von ASP.NET MVC zu tun . Dies ist die richtige Lösung, um zu verfolgen, wie das Bootstrap-Framework erstellt wurde.
<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>
Bearbeiten:
Da Sie Ihr Menü höchstwahrscheinlich auf mehreren Seiten wiederverwenden werden, wäre es klug, diese ausgewählte Klasse automatisch auf der Grundlage der aktuellen Seite anzuwenden, anstatt das Menü mehrmals zu kopieren und manuell auszuführen.
Am einfachsten ist es, einfach die darin enthaltenen Werte zu verwenden ViewContext.RouteData
, nämlich die Werte Action
und Controller
. Mit so etwas könnten wir auf dem aufbauen, was Sie derzeit haben:
<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>
Es ist nicht schön im Code, aber es erledigt den Job und ermöglicht es Ihnen, Ihr Menü in eine Teilansicht zu extrahieren, wenn Sie möchten. Es gibt Möglichkeiten, dies viel sauberer zu machen, aber da Sie gerade erst anfangen, lasse ich es dabei. Viel Glück beim Lernen von ASP.NET MVC!
Späte Bearbeitung:
Diese Frage scheint ein wenig Verkehr zu bekommen, also dachte ich mir, ich würde eine elegantere Lösung mit einer HtmlHelper
Erweiterung einführen.
Bearbeiten 24.03.2015: Diese Methode musste neu geschrieben werden, um mehrere Aktionen und Controller zu ermöglichen, die das ausgewählte Verhalten auslösen, sowie die Behandlung, wenn die Methode aus einer Teilansicht einer untergeordneten Aktion aufgerufen wird. Ich dachte, ich würde das Update freigeben!
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;
}
Funktioniert mit .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;
}
Beispielnutzung:
<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>