ASP.NET MVC3: как получить доступ к параметрам, передаваемым как анонимный тип routeValues ​​в методе расширения HtmlHelper? - PullRequest
3 голосов
/ 15 февраля 2011

Я написал метод расширения для 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.

Есть ли лучший способ получить доступ к свойствам анонимного типа?

1 Ответ

2 голосов
/ 16 февраля 2011

Я понял, что могу использовать конструктор в RouteValueDictionary, который позволяет мне легко искать свойство Area.

Я также заметил, что усложнил проблему, пытаясь использовать значение контроллера, поэтому мой код теперь выглядит следующим образом:

    public static MvcHtmlString NavigationLink<T>(this HtmlHelper<T> htmlHelper, string linkText, string actionName, string controllerName, object routeValues)
    {
        string currentArea = htmlHelper.ViewContext.RouteData.DataTokens["Area"] as string;

        if (IsInCurrentArea(routeValues, currentArea))
        {
            return htmlHelper.ActionLink(
                linkText,
                actionName,
                controllerName,
                routeValues,
                new
                {
                    @class = "active"
                });
        }
        return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues, null);
    }

    private static bool IsInCurrentArea(object routeValues, string currentArea)
    {
        if (routeValues == null)
            return true;

        var rvd = new RouteValueDictionary(routeValues);
        string area = rvd["Area"] as string ?? rvd["area"] as string;
        return area == currentArea;
    }
...