2009-07-20 9 views
31

In ASP.NET MVC esiste un modo per enumerare i controller tramite il codice e ottenere il loro nome?ASP.NET MVC a livello di programmazione Ottieni un elenco di controller

esempio:

AccountController 
HomeController 
PersonController 

mi avrebbe dato una lista come ad esempio:

Account, Home, Person 
+1

ASP.Net MVC lo sta già facendo, (vale a dire è come i nomi di controller vengono scoperti) se si potesse sfruttare l'attuale implementazione di MVC sarebbe probabilmente risparmiare un po 'di tempo. –

+1

questa è una domanda eccellente qui - come potrei farlo? –

risposta

12

È possibile riflettere attraverso l'assembly e trovare tutte le classi che ereditano dal tipo System.Web.MVC.Controller. Ecco alcuni esempi di codice che mostra come si potrebbe fare che:

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

+0

ho terminato usando questo approccio. Ho anche memorizzato nella cache l'elenco poiché sarebbe stato riutilizzato spesso. Grazie – DennyFerra

-1

creare la proprietà in ogni controller e quindi si ottiene il nome come questo.

+0

Questa è una buona idea, se le prestazioni sono un problema, quindi il tuo modo è probabilmente l'approccio migliore (supponendo che non usi la riflessione per scoprire le implementazioni). Altrimenti, usare la riflessione per afferrare il nome della classe dell'implementazione è il più semplice. –

+0

è giusto grazie per aver condiviso la conoscenza. – KuldipMCA

+0

Invece di incollarlo in ogni controller, è possibile creare la propria classe controller e rendere tutti i controller uno di questa classe, e l'unica cosa che si inserisce non è nella classe controller di base è questa proprietà ViewName –

42

Utilizzando Jon's suggestion of reflecting through the assembly, ecco un frammento si possono trovare utili:

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

Tutti coloro che utilizzando questo post meglio leggere questo post prima : using Assembly.GetCallingAssembly() not returns the calling assembly

Il problema è che le visualizzazioni del rasoio agiscono come assiemi dinamici indipendenti e non si ottiene l'assemblaggio desiderato.

Yair

+2

Non lo chiamerei da una vista, passerei le informazioni dal mio viewmodel, fare così mitigherebbe il tuo problema. –

Problemi correlati