Доступ к списку контроллеров / действий в приложении ASP.NET MVC

Мы знаем, что за кулисами платформа ASP.NET MVC будет использовать отражение, чтобы определить, какие контроллеры / действия доступны для выполнения, в зависимости от того, какие классы являются производными от System.Web.Mvc.Controller и какие методы из этих классов возвращают объект ActionResult.

На мой вопрос - можно ли получить доступ к этому списку контроллеров / действий из моего приложения MVC?

(Я мог бы сделать это сам, используя отражение в текущей сборке, но если список уже был создан ASP.NET MVC, я бы предпочел повторно использовать эти усилия, чем заново изобретать колесо сам.)


person Jonathan    schedule 26.04.2009    source источник


Ответы (2)


new ReflectedControllerDescriptor(typeof(TController)).GetCanonicalActions() вернет коллекцию объектов ActionDescriptor, показывающих все действия на контроллере. Он недостаточно умен, чтобы понимать такие вещи, как атрибуты выбора или атрибуты именования, поэтому не каждое возвращаемое им действие гарантированно может быть вызвано через Интернет. Но если вам нужно выполнить действия напрямую, вы можете вызвать ActionDescriptor.Execute () для любого интересующего вас действия.

person Levi    schedule 27.04.2009

Это делается в internal классе сборки System.Web.Mvc, называемой System.Web.Mvc.ControllerTypeCache.

Кстати, методы действия не обязаны возвращать ActionResult. Например, они могут счастливо вернуться void.

person mmx    schedule 26.04.2009
comment
Тогда, возможно, стоит уточнить, что представляет собой действие на контроллере. Я считаю, что любой общедоступный метод контроллера можно рассматривать как действие. - person AnthonyWJones; 26.04.2009
comment
Ага. Если, конечно, не указано явно как [NonAction]. - person mmx; 26.04.2009