Я пишу помощник для моего приложения, которое выписывает пункт меню для данного строго типизированного контроллера/действия следующим образом:Сравните два RouteValueDictionary экземпляры
<%= Html.MenuLink<WhateverController>(c => c.WhateverAction(), "Whatever") %>
В рамках этого процесса, я хотел бы применить класс active
к выведенной ссылке, если текущая страница и связанная с ней страница совпадают. Я считаю, что лучший способ сделать это - сравнить содержимое RouteValueDictionary
для текущего запроса с содержимым результата выражения, предоставленного вспомогательному методу. Тем не менее, я не могу найти хороший способ сравнить, являются ли элементы в двух RouteValueDictionary
s одинаковыми.
Есть ли простой способ сделать это? Я хочу эффективно завершить его следующим образом:
public static string MenuLink<T>(this HtmlHelper html, Expression<Action<T>> action, string linkText) where T : Controller
{
// var link = html.ActionLink<T>(action, linkText, new {}); // Not important yet
var routeValues = Microsoft.Web.Mvc.Internal.ExpressionHelper.GetRouteValuesFromExpression<T>(action); // Might change?
var currentRouteVals = html.ViewContext.RouteData.Values;
bool isActivePage = /* are the contents of routeValues also
inside currentRouteValues? */
var tb = new TagBuilder("li");
// Continues...
}
Я попытался с помощью встроенного сравнения (==), но мне кажется, что он использует реализацию по умолчанию равенства и поэтому возвращает ложь, так как они не тот же экземпляр. Я также пробовал следующее:
bool isActivePage = routeValues.All(x => currentRouteVals.ContainsValue(x));
но это также не работает. Я полностью лаяю неправильное дерево?