Я написал метод расширения для HtmlHelper (полученный из активного пункта меню - главная страница asp.net mvc3 ). Это позволяет мне выводить cssclass "active" для текущей страницы.
Однако теперь я реорганизовал использование областей, поэтому метод больше не работает, потому что у меня есть контроллеры с именем Home и действия с индексом в нескольких областях. Поэтому я пытался разобраться в этом, проверив текущую область с областью, передаваемой как часть значений маршрута анонимных типов.
Итак, мой метод расширения теперь выглядит так:
public static MvcHtmlString NavigationLink<T>(this HtmlHelper<T> htmlHelper, string linkText, string actionName, string controllerName, dynamic routeValues)
{
string currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller");
string currentArea = htmlHelper.ViewContext.RouteData.DataTokens["Area"] as string;
if (controllerName == currentController && IsInCurrentArea(routeValues,currentArea))
{
return htmlHelper.ActionLink(
linkText,
actionName,
controllerName,
(object)routeValues,
new
{
@class = "active"
});
}
return htmlHelper.ActionLink(linkText, actionName, controllerName, (object)routeValues, null);
}
private static bool IsInCurrentArea(dynamic routeValues, string currentArea)
{
string area = routeValues.Area; //This line throws a RuntimeBinderException
return string.IsNullOrEmpty(currentArea) && (routeValues == null || area == currentArea);
}
Я изменил тип routeValues на динамический, чтобы можно было скомпилировать следующую строку:
string area = routeValues.Area;
Я вижу свойство Area в объекте routeValues в отладчике, но как только я обращаюсь к нему, я получаю исключение RuntimeBinderException.
Есть ли лучший способ получить доступ к свойствам анонимного типа?