У Bootstrap active
клас потрібно застосовувати до <li>
елемента, а не до <a>
. Дивіться перший приклад тут: http://getbootstrap.com/components/#navbar
Те, як ви керуєтесь своїм стилем інтерфейсу, базуючись на тому, що є активним чи ні, не має нічого спільного з ActionLink
помічником ASP.NET MVC . Це правильне рішення прослідкувати, як побудована рамка 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>
Редагувати:
Оскільки ви, швидше за все, повторно використовуєте меню на кількох сторінках, було б розумно мати спосіб застосувати цей вибраний клас автоматично на основі поточної сторінки, а не копіювати меню кілька разів і робити це вручну.
Найпростіший спосіб - просто використовувати значення, що містяться в них ViewContext.RouteData
, а саме - Action
і Controller
значення. Ми могли б спиратися на те, що у вас зараз є щось подібне:
<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>
Це не дуже в коді, але це дозволить виконати роботу і дозволить вам витягнути своє меню в частковий вигляд, якщо хочете. Існують способи зробити це набагато чистіше, але оскільки ви тільки починаєте роботу, я покину це. Найкраща удача в навчанні ASP.NET MVC!
Пізнє редагування:
Це питання, здається, отримує трохи трафіку, тому я подумав, що я буду втілювати більш елегантне рішення за допомогою HtmlHelper
розширення.
Редагувати 24.04.2015: Довелося переписати цей метод, щоб дозволити декілька дій та контролерів, що викликають вибрану поведінку, а також обробку, коли метод викликається з дочірнього перегляду дійових дій, я подумав, що я поділюсь оновленням!
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;
}
Працює з .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;
}
Використання зразка:
<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>