路由的多个默认控制器

时间:2014-11-14 21:47:59

标签: asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing

简短的问题:

有没有办法在路由中配置多个默认控制器?

冗长的解释:

我在MVC 5中创建类似于portable area的东西。 具体来说,我想创建一种默认控制器,如果用户没有在他的应用程序中创建它,将从我的可移植组件触发。更确切地说:

  • 假设我有一个通过NuGet安装我的框架的MVC应用程序。
  • 此组件在_framework文件夹中安装了一堆视图,并且引用了DLL,并且MVC应用程序开始从我的FrameworkHTTPApplication继承。
  • 该基类默认配置一些东西,比如框架的视图引擎,用于搜索_framework文件夹中的视图,以及默认路由。
  • 现在我希望应用程序能够创建或不创建HomeController:如果他们不创建它,框架将调用FrameworkHomeController(在框架DLL中),但是如果他们确实创造了一个,它可以在击中〜/。

我能够在框架中创建默认控制器,并正确连接它,但它不会回退。这就是routeDebugger向我展示的内容:routes

如您所见,我已配置两个路由(相同的URL,不同的默认值)。我期待的是:如果控制器Home不存在,则应调用FrameworkHome

我玩过命名空间,但结果是一样的。

关于如何做到这一点的任何线索?

1 个答案:

答案 0 :(得分:1)

您可以使用单一路径解决此问题,并通过框架命名空间中的控制器优先处理应用程序命名空间中的控制器。

假设应用程序控制器在名称空间MyApplication.Controllers中定义,框架控制器在名称空间Framework.Controllers中定义。

对于根网址/,您希望应用程序与控制器匹配:

  • MyApplication.Controllers.HomeController如果已定义

  • 否则控制器Framework.Controllers.HomeController(请注意,这也称为HomeController,而不是FrameworkHomeController,但它在框架命名空间中定义)

这是通过一条默认路线实现的:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "MyApplication.Controllers" }                
);
当找到多个匹配的控制器时,路由中定义的Tha命名空间将被赋予优先权。因此,对于根URL /,使用默认控制器名称Home,如果系统找到2个控制器MyApplication.Controllers.HomeControllerFramework.Controllers.HomeController,则命名空间MyApplication.Controllers中的控制器{{1}}将被使用。