路由的多个默认控制器

问题描述:

简短问题:路由的多个默认控制器

是否有一种方法可以在路由中配置多个默认控制器?

朗解释:

我在MVC 5.创建类似portable area东西 具体来说,我想创造一种会从我的移植组件被解雇,如果用户没有创建默认控制器在他的申请中。更确切地说:

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

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

正如你所看到的,我配置了两条路由(相同的URL,不同的默认值)。我期待的是:如果控制器Home不存在,则应该调用FrameworkHome

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

任何线索如何做到这一点?

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

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

对于/你想要的应用程序到控制器匹配根URL:如果定义

  • 否则控制器Framework.Controllers.HomeController(注意,这也叫HomeController的,而不是FrameworkHomeController

    • MyApplication.Controllers.HomeController,但它在框架命名空间中定义)

    这是通过一个单一的默认路由来实现的:在路径定义

    routes.MapRoute(
        "Default", 
        "{controller}/{action}/{id}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
        namespaces: new[] { "MyApplication.Controllers" }     
    ); 
    

    临屋的名称空间被给予优先权时找到多个匹配控制器。因此,对于根网址/,使用默认控制器名称Home,并且如果系统找到2个控制器MyApplication.Controllers.HomeControllerFramework.Controllers.HomeController,则将使用名称空间MyApplication.Controllers中的一个。

  • +0

    它工作得很漂亮。我错误的一件事是命名空间;我在没有“控制器”部分的情况下添加了它,这是一个问题。一旦我改变了使用整个命名空间的路线,它就开始工作得很好。 – 2014-11-15 22:49:28