手动复制 AreaRegistration.RegisterAllAreas 以仅加载 select 个区域?

Manually replicating AreaRegistration.RegisterAllAreas to load only select Areas?

我是 ASP.NET 的新手,我正在想办法为不同的主题创建多个前端区域。但是区域路由会发生冲突,所以我需要手动加载我想用作活动前端主题的相关区域。

我想要不同的区域,而不仅仅是共享模型和控制器的视图集(使用自定义 RazorViewEngine 很容易实现),因为每个人的模型/控制器可能完全不同主题。

这能做到吗?或者我可以用其他方式做到这一点吗?

所以我想注册后端区域和前端区域之一而不是 AreaRegistration.RegisterAllAreas(即使有多个可用).

在获得答案时收效甚微,决定 post 我的解决方案在这里并遗憾地回答我自己的问题。

鉴于 AreaRegistrations 的不稳定加载顺序,我最终将 AreaRegistration.RegisterAllAreas(); 替换为:

static void RegisterArea<AR>(RouteCollection routes, object state)
    where AR : AreaRegistration
{
    var registration = Activator.CreateInstance(typeof(AR)) as AreaRegistration;
    var context = new AreaRegistrationContext(registration.AreaName, routes, state);
    var namespaceset = registration.GetType().Namespace;
    if (!string.IsNullOrEmpty(namespaceset))
    {
        // Important to relatively resolve Controllers
        context.Namespaces.Add(namespaceset + ".*");
    }
    registration.RegisterArea(context);
}

我是这样使用代码的:

RegisterArea<Areas.Backend.BackendAreaRegistration>(RouteTable.Routes, null);
RegisterArea<Areas.Frontend.FrontendAreaRegistration>(RouteTable.Routes, null);

这允许您手动决定 Areas 的顺序。当你在 Frontend 路由中有 {*anything} 指令可能在 Backend 路由之前加载时特别有用。