Может показаться, что единственный способ получить маршруты, зарегистрированные в вашем проекте, - это перечислить проект для типов, которые наследуют AreaRegistration, и, по-видимому, нет ни одного частного или общедоступного объекта, который отслеживал бы зарегистрированные в данный момент области.
Далее следует длинное объяснение ...
Здесь следует помнить, что области представляют собой нечто большее, чем просто связь между произвольной строкой и списком пространств имен.Когда область регистрируется, она просто расширяет коллекцию маршрутов для приложения некоторыми новыми правилами, которые можно идентифицировать с помощью уникальной «области» DataToken.
Если вы посмотрите на процесс регистрации области, вы должны наследовать от System.Web.Mvc.AreaRegistration и переопределить RegisterArea () .RegisterArea () получает AreaRegistrationContext , который определяет имя области, коллекцию маршрутов и состояние объекта, но если вы наблюдаете формат для реализации RegisterArea (), он возвращает void и ничего не делает для сохранения объекта контекста.Более того, если вы посмотрите на код, который выполняется до того, как RegisterArea () запущен (Reflector), вы увидите, что объект AreaRegistrationContext, который передается в RegisterArea (), никогда не отслеживается постоянно.
internal static void RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, object state)
{
foreach (Type type in TypeCacheUtil.GetFilteredTypesFromAssemblies("MVC-AreaRegistrationTypeCache.xml", new Predicate<Type>(AreaRegistration.IsAreaRegistrationType), buildManager))
{
((AreaRegistration) Activator.CreateInstance(type)).CreateContextAndRegister(routes, state);
}
}
internal void CreateContextAndRegister(RouteCollection routes, object state)
{
AreaRegistrationContext context = new AreaRegistrationContext(this.AreaName, routes, state);
string str = base.GetType().Namespace;
if (str != null)
{
context.Namespaces.Add(str + ".*");
}
this.RegisterArea(context);
}
AsВы можете видеть, что вызов статического метода RegisterAllAreas () вызывает внутренний RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, object state)
, который затем вызывает внутренний CreateContextAndRegister(RouteCollection routes, object state)
, который создает AreaRegistrationContext и передает его RegisterArea()
.
Насколько я могу судить, никогда, ни в коем случае, AreaRegistrationContext не создается для каждой области, сохраняемой постоянно.