2009-04-26 5 views
9

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

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

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

ответ

15

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

6

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

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

+0

Возможно, стоит уточнить то, что составляет действие на контроллере. Любой публичный метод на контроллере можно рассматривать как действие, которое я считаю. – AnthonyWJones

+0

Да. Если явно не объявлено как '[NonAction]', конечно. –

Смежные вопросы