#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;
}