ASP.NET MVC4 Список всех областей

У меня есть приложение ASP.NET MVC4, в котором я создаю несколько областей, есть ли способ, который я могу программно определить количество областей, которые присутствуют, и их имена.

Ответ 1

AreaRegistration.RegisterAllAreas(); регистрирует каждый маршрут области с помощью DataTokens["area"], где значение является именем области.

Таким образом, вы можете получить имена зарегистрированных областей из RouteTable

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

Если вы ищете самих AreaRegistration, вы можете использовать отражение, чтобы получить типы, которые происходят из AreaRegistration в вашем assambly.

Ответ 2

AreaRegistration.RegisterAllAreas() не может использоваться для предварительной инициализации веб-приложения. Однако, если вы хотите получить области без вызова RegisterAllAreas(), например. в автоматическом тесте, может оказаться полезным следующий код:

     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 - это класс, полученный из HttpApplication. Вы можете использовать любое имя класса, если этот класс находится в той же сборке, что и регистрацию сборки, то есть классы, полученные из AreaRegistration. Если вы разделили приложение с областями более чем на одну сборку, вам нужно будет соответствующим образом адаптировать этот код, чтобы он просматривал все эти сборки.