2009-07-20 13 views
31

En ASP.NET MVC hay una manera de enumerar los controladores a través del código y obtener su nombre?ASP.NET MVC Programmatically Get an List of Controllers

ejemplo:

AccountController 
HomeController 
PersonController 

me daría una lista como:

Account, Home, Person 
+1

ASP.Net MVC ya lo está haciendo, (es decir, es la forma en que se descubren los nombres de los controladores) si se puede aprovechar la actual aplicación de MVC probablemente le ahorraría algo de tiempo. –

+1

esa es una pregunta excelente aquí, ¿cómo podría hacer eso? –

Respuesta

12

Puede reflejar a través de su conjunto y encontrar todas las clases que heredan del tipo System.Web.MVC.Controller. He aquí algunos ejemplos de código que muestra cómo se puede hacer eso:

http://mvcsitemap.codeplex.com/WorkItem/View.aspx?WorkItemId=1567

+0

Terminé usando este enfoque También guardé en la memoria caché la lista, ya que se volvería a usar con frecuencia. Gracias – DennyFerra

-1

crear la propiedad de todos los controladores y luego obtener el nombre de esta manera.

+0

Esta es una buena idea, si el rendimiento es un problema, entonces su camino es probablemente el mejor enfoque (suponiendo que no utilice el reflejo para descubrir las implementaciones). De lo contrario, usar la reflexión para captar el nombre de clase de la implementación es el más fácil. –

+0

eso es correcto gracias por compartir conocimiento. – KuldipMCA

+0

En lugar de pegar esto en cada controlador, puede crear su propia clase de controlador y hacer que todos sus controladores sean de esta clase, y lo único que pone en él que no está en la clase de controlador base es esta propiedad ViewName –

42

Usando Jon's suggestion of reflecting through the assembly, aquí es un fragmento que puede encontrar útiles:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Web.Mvc; 

public class MvcHelper 
{ 
    private static List<Type> GetSubClasses<T>() 
    { 
     return Assembly.GetCallingAssembly().GetTypes().Where(
      type => type.IsSubclassOf(typeof(T))).ToList(); 
    } 

    public List<string> GetControllerNames() 
    { 
     List<string> controllerNames = new List<string>(); 
     GetSubClasses<Controller>().ForEach(
      type => controllerNames.Add(type.Name)); 
     return controllerNames; 
    } 
} 
0

Todos los que el uso de este post mejor leer este post antes : using Assembly.GetCallingAssembly() not returns the calling assembly

El problema es que las vistas de la maquinilla de afeitar están actuando como conjuntos dinámicos independientes y no se obtiene el ensamblaje deseado.

Yair

+2

No llamaría esto desde una vista, me gustaría pasar la información de mi modelo de vista, lo que mitigaría su problema. –

Cuestiones relacionadas