2009-04-26 5 views
9

Sabemos que detrás de las escenas, el marco ASP.NET MVC utilizará la reflexión para determinar qué controladores/acciones están disponibles para ejecutarse, en función de qué clases derivan desde System.Web.Mvc.Controller y, de esas clases, qué métodos devuelven un objeto ActionResult.Accediendo a la lista de Controladores/Acciones en una aplicación ASP.NET MVC

Para mi pregunta: ¿es posible acceder a esta lista de controladores/acciones desde mi aplicación MVC?

(Podría hacerlo yo mismo, utilizando la reflexión en el ensamblaje actual, pero si la lista ya ha sido creada por ASP.NET MVC, preferiría volver a utilizar ese esfuerzo que reinventar la rueda yo mismo.)

Respuesta

15

new ReflectedControllerDescriptor(typeof(TController)).GetCanonicalActions() devolverá una colección de objetos ActionDescriptor mostrando todas las acciones en el controlador. No es lo suficientemente inteligente como para comprender aspectos como los atributos de selección o los atributos de nomenclatura, por lo que no se garantiza que cada acción que regrese pueda invocarse en la web. Pero si necesita ejecutar las acciones directamente, puede llamar a ActionDescriptor.Execute() sobre cualquier acción que le interese.

6

Esto se hace en una clase internal en el ensamblaje System.Web.Mvc llamado System.Web.Mvc.ControllerTypeCache.

Por cierto, los métodos de acción no son necesarios para devolver ActionResult. Pueden devolver void felizmente, por ejemplo.

+0

Puede valer la pena aclarar, entonces, ¿qué constituye una acción en un controlador. Cualquier método público en un controlador puede verse como una acción que creo. – AnthonyWJones

+0

Sí. A menos que se declare explícitamente como '[NonAction]', por supuesto. –

Cuestiones relacionadas