When I want a specific menu link to be active at a given page, I’m using this approach in Razor:
On the master layout I have these checks:
var active = ViewBag.Active;
const string ACTIVE_CLASS = "current";
if (active == "home")
{
ViewBag.ActiveHome = ACTIVE_CLASS;
}
if (active == "products")
{
ViewBag.ActiveProducts = ACTIVE_CLASS;
}
etc.
The html menu on the master layout:
<ul>
<li class="@ViewBag.ActiveHome"><a href="/">Home</a></li>
<li class="@ViewBag.ActiveProducts"><a href="@Url.Action("index", "products")">Products</a></li>
</ul>
When specifying which layout page to use on a different view:
@{
ViewBag.Active = "home";
Layout = "~/Views/Shared/_Layout.cshtml";
}
Is there a better approach to sepcify active links, than the one I’m currently using?
A better approach is to use a HTML helper:
and then:
To make the above work you need your views to recognize your extension: In Web.config in the Views folder, add
<add namespace="yourNamespacehere.Helpers" />inside the namespaces tag. Then build your project and close and re-open the view you are adding this to.then based on the current action and controller the helper will add or not the
activeclass when generating the anchor.