Выделите текущее выбранное меню (на основе action controller routeValues)

#asp.net-mvc

#asp.net-mvc

Вопрос:

Я пытаюсь реализовать меню для моего решения MVC3. В этом меню у меня есть ссылки 2 типа:

  • классические ссылки на основе action controller

Пример 1: action = «Studies» controller = «Main»

Пример 2: действие = «Контакт» контроллер = «Главный»

  • немного более сложные ссылки на основе action controller routeValues

Пример 3: действие = «Список» контроллер = «Проект» значения маршрута = новый { категория = «БАНК» }

Пример 4: действие = «Список» контроллер = «Проект» значения маршрута = новый { категория = «ФАРМА» }

Меню отображается следующим образом:

  • Исследования
  • Контакты
  • Банк
  • Фармацевтика

Я хотел бы выбрать текущий активный пункт меню на основе активной страницы. Для достижения этой цели я реализую HtmlHelper следующим образом:

 public static MvcHtmlString ActionMenuItem(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
    {
        var route = htmlHelper.ViewContext.RequestContext.RouteData;
        var controller = route.GetRequiredString("controller");
        var action = route.GetRequiredString("action");
    
        // some code here...

        if ((controller == controllerName) amp;amp; (action == actionName))
        {
            tag.AddCssClass("active");
        }
        else
        {
            tag.AddCssClass("inactive");
        }

        // some code here...
    }
  

Проблема с этой базовой реализацией заключается в том, что условие активации / деактивации пункта меню основано только на значениях action и controller . Мне также нужно проверить мои значения routeValues на наличие «сложных ссылок» (пример 3 и 4).

Как я могу это реализовать?

Спасибо за вашу помощь.

Ответ №1:

 public static MvcHtmlString ActionMenuItem(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
{
    var route = htmlHelper.ViewContext.RequestContext.RouteData;
    var rvd = HtmlHelper.AnonymousObjectToHtmlAttributes(routeValues);

    // some code here...

    if (IsRouteValuesMatch(rvd, route))
    {
        tag.AddCssClass("active");
    }
    else
    {
        tag.AddCssClass("inactive");
    }

    // some code here...
}

private static bool IsRouteValuesMatch(RouteValueDictionary rvd, RouteData routeData)
{
    foreach (var item in rvd)
    {
        var value1 = item.Value as string;
        var value2 = routeData.Values[item.Key] as string;
        if (!string.Equals(value1, value2, StringComparison.OrdinalIgnoreCase))
        {
            return false;
        }
    }
    return true;
}