Я пишу помощника для моего приложения, который записывает пункт меню для данного строго типизированного контроллера / действия следующим образом:
<%= Html.MenuLink<WhateverController>(c => c.WhateverAction(), "Whatever") %>
В рамках этого процесса я хотел бы применить класс active
к выводимой ссылке, если текущая страница и ссылка на нее совпадают. Я полагаю, что лучший способ сделать это - сравнить содержимое RouteValueDictionary
для текущего запроса с результатом выражения, переданного вспомогательному методу. Однако я не могу найти хороший способ сравнить, совпадают ли пункты в двух RouteValueDictionary
с.
Есть ли простой способ сделать это? Я действительно хочу завершить это следующим образом:
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...
}
Я попытался использовать встроенное сравнение (==), но кажется, что оно использует реализацию равенства по умолчанию и поэтому возвращает false, поскольку они не являются одним и тем же экземпляром. Я также попробовал следующее:
bool isActivePage = routeValues.All(x => currentRouteVals.ContainsValue(x));
но это тоже не работает. Я полностью лаю не на том дереве?