Mvc,在不使用 AreaRegistration 的情况下即时注册区域
Mvc, Register area on the fly without using AreaRegistration
我尝试创建一个适用于多个 MVC 项目的框架。我想将每个项目添加为一个区域。
我不能在每个项目中使用 AreaRegistration
,所以我尝试在我的代码中模拟区域,如下所示:
foreach (var module in InstalledModules)
{
routeCollection.MapRoute(
name: "Default_" + module.AreaName,
url: module.AreaName + "/{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional },
namespaces: new[] { module.Namespace }
);
}
InstalledModules
是包含区域名称如 Module1
和模块程序集的根名称空间如 MvcProject.Module1
的所有模块的列表。上面的代码 MapRoute
所有已安装的模块,但它不起作用。对于所有请求,首先注册的路由命中和 MVC 尝试在错误的程序集(位置)中查找控制器。
有什么方法可以将项目程序集动态注册为区域吗?
或
如何自定义查找匹配路由方法?
您是否在命名空间中指定了 Controllers
?您的 InstalledModules
列表必须是这样的:
var InstalledModules = new List<InstalledModule>
{
new InstalledModule() { AreaName = "Main", Namespace ="MainWeb.Controllers"},
new InstalledModule() { AreaName = "Web1", Namespace = "WebApplication1.Controllers"},
new InstalledModule() { AreaName = "Web2", Namespace = "WebApplication2.Controllers"},
};
我发现了我的问题。路由集合始终包含默认路由。当我删除它时,一切正常。
我尝试创建一个适用于多个 MVC 项目的框架。我想将每个项目添加为一个区域。
我不能在每个项目中使用 AreaRegistration
,所以我尝试在我的代码中模拟区域,如下所示:
foreach (var module in InstalledModules)
{
routeCollection.MapRoute(
name: "Default_" + module.AreaName,
url: module.AreaName + "/{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional },
namespaces: new[] { module.Namespace }
);
}
InstalledModules
是包含区域名称如 Module1
和模块程序集的根名称空间如 MvcProject.Module1
的所有模块的列表。上面的代码 MapRoute
所有已安装的模块,但它不起作用。对于所有请求,首先注册的路由命中和 MVC 尝试在错误的程序集(位置)中查找控制器。
有什么方法可以将项目程序集动态注册为区域吗?
或
如何自定义查找匹配路由方法?
您是否在命名空间中指定了 Controllers
?您的 InstalledModules
列表必须是这样的:
var InstalledModules = new List<InstalledModule>
{
new InstalledModule() { AreaName = "Main", Namespace ="MainWeb.Controllers"},
new InstalledModule() { AreaName = "Web1", Namespace = "WebApplication1.Controllers"},
new InstalledModule() { AreaName = "Web2", Namespace = "WebApplication2.Controllers"},
};
我发现了我的问题。路由集合始终包含默认路由。当我删除它时,一切正常。