In Bootstrap la activeclasse deve essere applicata <li>all'elemento e non a <a>. Guarda il primo esempio qui: http://getbootstrap.com/components/#navbar
Il modo in cui gestisci il tuo stile di interfaccia utente in base a ciò che è attivo o meno non ha nulla a che fare con l' ActionLinkhelper di ASP.NET MVC . Questa è la soluzione corretta per seguire come è stato creato il framework Bootstrap.
<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>
Modificare:
Poiché molto probabilmente riutilizzerai il tuo menu su più pagine, sarebbe intelligente avere un modo per applicare quella classe selezionata automaticamente in base alla pagina corrente piuttosto che copiare il menu più volte e farlo manualmente.
Il modo più semplice è semplicemente usare i valori contenuti in ViewContext.RouteData, vale a dire i valori Actione Controller. Potremmo basarci su ciò che hai attualmente con qualcosa del genere:
<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>
Non è abbastanza nel codice, ma eseguirà il lavoro e ti consentirà di estrarre il menu in una vista parziale, se lo desideri. Ci sono modi per farlo in un modo molto più pulito, ma da quando hai appena iniziato lo lascerò a quello. Buona fortuna per imparare ASP.NET MVC!
Modifica tardiva:
Questa domanda sembra ricevere un po 'di traffico, quindi ho pensato di aggiungere una soluzione più elegante usando HtmlHelperun'estensione.
Modifica 24-24-2015: ho dovuto riscrivere questo metodo per consentire più azioni e controller che attivano il comportamento selezionato, nonché la gestione per quando il metodo viene chiamato da una vista parziale dell'azione figlio, pensato di condividere l'aggiornamento!
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;
}
Funziona con .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;
}
Esempio di utilizzo:
<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>