Trong Bootstrap, active
lớp cần được áp dụng cho <li>
phần tử chứ không phải <a>
. Xem ví dụ đầu tiên tại đây: http://getbootstrap.com/components/#navbar
Cách bạn xử lý kiểu UI của bạn dựa trên những gì đang hoạt động hay không liên quan đến trình ActionLink
trợ giúp của ASP.NET MVC . Đây là giải pháp thích hợp để làm theo cách xây dựng khung 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>
Biên tập:
Vì rất có thể bạn sẽ sử dụng lại menu của mình trên nhiều trang, nên sẽ rất thông minh khi áp dụng lớp đã chọn đó tự động dựa trên trang hiện tại thay vì sao chép menu nhiều lần và thực hiện thủ công.
Cách dễ nhất là chỉ cần sử dụng các giá trị có trong ViewContext.RouteData
, cụ thể là Action
và Controller
các giá trị. Chúng tôi có thể xây dựng dựa trên những gì bạn hiện có với thứ như thế này:
<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>
Nó không đẹp về mã, nhưng nó sẽ hoàn thành công việc và cho phép bạn trích xuất menu của mình thành một phần xem nếu bạn muốn. Có nhiều cách để làm điều này theo cách sạch sẽ hơn nhiều, nhưng vì bạn mới bắt đầu nên tôi sẽ để nó ở đó. Tốt nhất của may mắn học ASP.NET MVC!
Chỉnh sửa muộn:
Câu hỏi này dường như nhận được một chút lưu lượng truy cập vì vậy tôi nghĩ rằng tôi sẽ đưa ra một giải pháp thanh lịch hơn bằng cách sử dụng HtmlHelper
tiện ích mở rộng.
Chỉnh sửa 03-24-2015: Phải viết lại phương thức này để cho phép nhiều hành động và bộ điều khiển kích hoạt hành vi đã chọn, cũng như xử lý khi phương thức được gọi từ chế độ xem một phần hành động con, nghĩ rằng tôi sẽ chia sẻ bản cập nhật!
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;
}
Hoạt động với .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;
}
Sử dụng mẫu:
<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>