Di Bootstrap active
kelas perlu diterapkan ke <li>
elemen dan bukan <a>
. Lihat contoh pertama di sini: http://getbootstrap.com/components/#navbar
Cara Anda menangani gaya UI Anda berdasarkan apa yang aktif atau tidak tidak ada hubungannya dengan ActionLink
pembantu ASP.NET MVC . Ini adalah solusi yang tepat untuk mengikuti bagaimana kerangka kerja Bootstrap dibangun.
<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>
Edit:
Karena Anda kemungkinan besar akan menggunakan kembali menu Anda di beberapa halaman, akan lebih baik untuk memiliki cara untuk menerapkan kelas yang dipilih secara otomatis berdasarkan halaman saat ini daripada menyalin menu beberapa kali dan melakukannya secara manual.
Cara termudah adalah dengan hanya menggunakan nilai yang terkandung di dalamnya ViewContext.RouteData
, yaitu nilai Action
dan Controller
. Kami dapat mengembangkan apa yang saat ini Anda miliki dengan sesuatu seperti ini:
<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>
Itu tidak cantik dalam kode, tetapi itu akan menyelesaikan pekerjaan dan memungkinkan Anda untuk mengekstrak menu Anda ke tampilan parsial jika Anda suka. Ada beberapa cara untuk melakukan ini dengan cara yang jauh lebih bersih, tetapi karena Anda baru memulai saya akan membiarkannya begitu saja. Semoga sukses belajar ASP.NET MVC!
Edit terlambat:
Pertanyaan ini tampaknya mendapatkan sedikit lalu lintas jadi saya pikir saya akan memberikan solusi yang lebih elegan menggunakan HtmlHelper
ekstensi.
Sunting 03-24-2015: Harus menulis ulang metode ini untuk memungkinkan beberapa tindakan dan pengendali memicu perilaku yang dipilih, serta menangani ketika metode ini dipanggil dari tampilan parsial aksi anak, pikir saya akan berbagi pembaruan!
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;
}
Bekerja dengan .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;
}
Penggunaan sampel:
<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>