2013-03-28 27 views

Odpowiedz

30

Funkcja AreaRegistration.RegisterAllAreas(); rejestruje trasę każdego obszaru za pomocą DataTokens["area"], gdzie wartość jest nazwą obszaru.

Więc można uzyskać zarejestrowane nazwy powierzchnia od RouteTable

var areaNames = RouteTable.Routes.OfType<Route>() 
    .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area")) 
    .Select(r => r.DataTokens["area"]).ToArray(); 

Jeśli szukasz AreaRegistration siebie można użyć refleksji uzyskać rodzajów która wywodzi się z AreaRegistration w assambly.

+0

Dzięki za szybką odpowiedź – dev

0

Nie można użyć przed inicjalizacją aplikacji internetowej. Jeśli jednak chcesz uzyskać obszary bez wywoływania RegisterAllAreas(), np. w zautomatyzowanym teście, to poniższy kod może być pomocne:

 var areaNames = new List<string>(); 
    foreach (var type in typeof(MvcApplication).Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(AreaRegistration)))) { 
     var areaRegistration = Activator.CreateInstance(type) as AreaRegistration; 
     areaNames.Add(areaRegistration.AreaName); 
    } 

MvcApplication Zauważ, że to klasa pochodzi od HttpApplication. Można użyć dowolnej nazwy klasy, o ile ta klasa znajduje się w tym samym zespole, co rejestracje zespołów, tj. Klas pochodnych od AreaRegistration. Jeśli podzielisz aplikację na obszary w więcej niż jednym zespole, musisz odpowiednio dostosować ten kod, aby przeszukać wszystkie te złożenia.