Asp.net Mvc: список всех действий на контроллере с определенным атрибутом - PullRequest
9 голосов
/ 31 августа 2009

Я пытаюсь перечислить все контроллеры и их действия с определенными атрибутами для создания динамической карты сайта Google. Чтобы я мог «пометить» определенные действия атрибутом, чтобы они отображались на карте сайта.

Здесь Я узнал, как получить все контроллеры. Но я не уверен, как получить все свои действия с определенным атрибутом. Я попробовал GetMethods и затем использовал GetCustomAttributes, но я не уверен, что это правильный способ сделать это. Это было немного сложнее.

Как только я получу контроллеры и их действия, я собираюсь использовать методику, объясненную здесь , чтобы получить URL-адреса. Как вы можете заметить, Эрик Дункан говорит о том, чего я пытаюсь достичь в этом вопросе.

Заранее спасибо.

1 Ответ

18 голосов
/ 31 августа 2009

Я использую некоторый код в своих модульных тестах, чтобы проверить, что определенные действия украшены атрибутами. Он использует отражение с неким перечисляемым совершенством метода расширения. Я думаю, что вы могли бы адаптировать это. Обратите внимание: если вас интересует, существует ли он или нет, вы можете использовать Count () для перечисления, а не получать фактический атрибут. Этот способ дает вам некоторую гибкость в использовании свойств атрибута для настройки поведения. Использование дерева наследования позволит вам украсить весь контроллер.

 var methods= controller.GetType()
                        .GetMethods( BindingFlags.Public | BindingFlags.Instance )
 foreach (var info in methods)
 {
     if (info.ReturnType  == typeof(ActionResult))
     {
        var attribute = info.GetCustomAttributes( typeof( SiteMapAttribute ), true )
                            .Cast<SiteMapAttribute>()
                            .FirstOrDefault();

        if (attribute != null && !attribute.Exclude.Contains( info.Name ))
        {
            ...
        }
    }
}
...