If you have used Bootstrap with your ASP.NET MVC application, you might have faced some issues with implementing active links of it’s Navbar component. We’ll have to dynamically add a css class called active to the particular menu item in order to make it selected in the Navbar. Here is a HtmlHelper extension which is capable of rendering menu items as well as drop-down menu items. I’ve used ASP.NET MVC 5 with Razor and Bootstrap 3.
First step is to create a HtmlHelper extension class.
using System.Web.Mvc; public static class MenuLinkExtension { public static MvcHtmlString MenuLink(this HtmlHelper htmlHelper, string itemText, string actionName, string controllerName, MvcHtmlString[] childElements = null) { var currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action"); var currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller"); string finalHtml; var linkBuilder = new TagBuilder("a"); var liBuilder = new TagBuilder("li"); if (childElements != null && childElements.Length > 0) { linkBuilder.MergeAttribute("href", "#"); linkBuilder.AddCssClass("dropdown-toggle"); linkBuilder.InnerHtml = itemText + " <b class=\"caret\"></b>"; linkBuilder.MergeAttribute("data-toggle", "dropdown"); var ulBuilder = new TagBuilder("ul"); ulBuilder.AddCssClass("dropdown-menu"); ulBuilder.MergeAttribute("role", "menu"); foreach (var item in childElements) { ulBuilder.InnerHtml += item + "\n"; } liBuilder.InnerHtml = linkBuilder + "\n" + ulBuilder; liBuilder.AddCssClass("dropdown"); if (controllerName == currentController) { liBuilder.AddCssClass("active"); } finalHtml = liBuilder.ToString() + ulBuilder; } else { var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection); linkBuilder.MergeAttribute("href", urlHelper.Action(actionName, controllerName)); linkBuilder.SetInnerText(itemText); liBuilder.InnerHtml = linkBuilder.ToString(); if (controllerName == currentController && actionName == currentAction) { liBuilder.AddCssClass("active"); } finalHtml = liBuilder.ToString(); } return new MvcHtmlString(finalHtml); } }
Once you have saved it, you can it by just calling like this!
<header class="navbar navbar-inverse navbar-fixed-top bs-docs-nav" role="banner"><div class="container"><div class="navbar-header"><a href="#" class="navbar-brand">Mvc Shop</a></div><nav role="navigation"><ul class="nav navbar-nav"> @Html.MenuLink("Home", "Index", "Home") @Html.MenuLink("Dropdown", "Index", "Home2", new MvcHtmlString[]{ @Html.MenuLink("Link1", "Action1", "Controller1"), @Html.MenuLink("Link2", "Action2", "Controller1"), @Html.MenuLink("Link3", "Action3", "Controller1"), }) @Html.MenuLink("JavaScript", "Index", "Home1", new MvcHtmlString[]{ @Html.MenuLink("Link1", "Index1", "Home1"), @Html.MenuLink("Link2", "Index2", "Home1"), @Html.MenuLink("Link3", "Index3", "Home1") })</ul></nav></div></header>