Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

select right menu on master page in MVC from child page

I have a couple of list items in a shared _layout.cshtm file (master page) in my MVC application.

something like:

<ul>
    <li>Home</li>
    <li>about</li>
    <li>contact</li>
    <li>blog</li>
</ul>

when the user is in a homepage, I want home li item to have class selected, like so:

<li class="selected">Home</li>

and so on. What is the best way to do this?

In regular asp.net website, I used to have a method in master page and call that method from child page but in MVC I am not sure what to do.

thanks.

like image 903
LocustHorde Avatar asked Dec 21 '22 10:12

LocustHorde


1 Answers

You could write a custom helper method:

public static MvcHtmlString MenuItem(
    this HtmlHelper htmlHelper, 
    string text,
    string action, 
    string controller
)
{
    var li = new TagBuilder("li");
    var routeData = htmlHelper.ViewContext.RouteData;
    var currentAction = routeData.GetRequiredString("action");
    var currentController = routeData.GetRequiredString("controller");
    if (string.Equals(currentAction, action, StringComparison.OrdinalIgnoreCase) &&
        string.Equals(currentController, controller, StringComparison.OrdinalIgnoreCase))
    {
        li.AddCssClass("selected");
    }
    li.SetInnerText(text);
    return MvcHtmlString.Create(li.ToString());
}

and then:

<ul>
    @Html.MenuItem("Home", "home", "home")
    @Html.MenuItem("About", "about", "home")
    @Html.MenuItem("Contact", "contact", "home")
    @Html.MenuItem("Blog", "blog", "home")
</ul>

The helper check the current action and controller and if they match the one passed as arguments to the helper it appends the selected CSS class to the li.

like image 154
Darin Dimitrov Avatar answered Jan 23 '23 07:01

Darin Dimitrov