手动复制AreaRegistration.RegisterAllAreas只加载选择区域?

时间:2015-07-17 15:05:16

标签: asp.net asp.net-mvc razor asp.net-mvc-areas

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

我想要不同的区域,而不仅仅是可以共享模型和控制器的视图集(使用自定义RazorViewEngine轻松实现),因为模型/控制器可能会因每个主题而有所不同。

可以这样做吗?或者我可以用另一种方式做到这一点吗?

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

1 个答案:

答案 0 :(得分:2)

在得到答案方面收效甚微,决定在这里发布我的解决方案并遗憾地回答我自己的问题。

鉴于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的顺序。当{*anything}路由中的Frontend指令可能最终在Backend路由之前加载时,尤其有用。