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"},
};

我发现了我的问题。路由集合始终包含默认路由。当我删除它时,一切正常。