Установите для меню активный класс на основе выбора в asp.net - PullRequest
0 голосов
/ 14 апреля 2020

У меня проблема с выбором меню в моем приложении. По сути, у меня есть боковое меню, которое динамически заполняется из базы данных.

foreach (var item in Model.SideMenuItemsList)
{
    <li id="@item.Id" class="@Html.IsSelected(actions: "Index, Profile", controllers: "Employee, Policy")">
        <a href="@{if (item.SubMenus.Count > 0) { <text> #exampledropdownDropdown </text>} else { @item.Url} } " @{if (item.SubMenus.Count > 0) { <text> aria-expanded="false" data-toggle="collapse" </text>  } }> <i class="@item.Icon"></i>@item.Name</a>
        <ul id="exampledropdownDropdown" class="collapse list-unstyled">

            @foreach (var subMenus in item.SubMenus)
            {
                <li><a href="@subMenus.Url"><i class="@subMenus.Icon"></i>@subMenus.Name</a></li>
            }
        </ul>
    </li>
}

Я использовал пользовательский помощник Html, чтобы сделать выбор меню, если я нахожусь на определенной c странице. Html Helper выглядит следующим образом:

public static string IsSelected(this IHtmlHelper htmlHelper, string controllers, string actions, string cssClass = "active")
{
    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;
}

Устанавливает класс меню на active. Но проблема здесь в том, что все мое меню установлено активным. Как я могу решить эту проблему, чтобы сделать активным только текущий, основываясь на моей странице? Пожалуйста, помогите.

1 Ответ

0 голосов
/ 15 апреля 2020

Некоторая помощь Здесь , С здесь

Вам нужно написать HtmlHelper, который добавит класс «активный» к текущей ссылке на каждой странице. нагрузить. Создайте папку с именем Helpers в своем проекте и добавьте пользовательский класс HtmlHelper.

using System;
using System.Web.Mvc;

public static class ActiveMenuHelper
{
    public static MvcHtmlString MenuLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string areaName)
    {
        var currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action");
        var currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller");
        var currentArea = htmlHelper.ViewContext.RouteData.DataTokens["area"];

        var builder = new TagBuilder("li")
        {
            //InnerHtml = htmlHelper.ActionLink(linkText, actionName, controllerName).ToHtmlString()
            InnerHtml = "<a href=\"" + new UrlHelper(htmlHelper.ViewContext.RequestContext).Action(actionName, controllerName, new { area = areaName }).ToString() + "\">" + linkText + "</a>"
        };

        if (String.Equals(controllerName, currentController, StringComparison.CurrentCultureIgnoreCase) && String.Equals(actionName, currentAction, StringComparison.CurrentCultureIgnoreCase))
            builder.AddCssClass("active");

        return new MvcHtmlString(builder.ToString());
    }
}

, а затем в частичное представление:

@using YourProjectName.Helpers

<ul>
    @Html.MenuLink("Resume", "Index", "Resume", "" )
    @Html.MenuLink("Cover Letter", "Index", "CoverLetter", "" )
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...