手动复制 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
路由之前加载时特别有用。
我是 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
路由之前加载时特别有用。