【问题标题】:Multiple default controllers for a route路由的多个默认控制器
【发布时间】:2014-11-15 20:54:03
【问题描述】:

简短的问题:

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

详细解释:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    • 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" }                
    );
    

    当找到多个匹配的控制器时,路由中定义的命名空间将被优先考虑。所以对于根 url / 使用默认控制器名称 Home,如果系统找到 2 个控制器 MyApplication.Controllers.HomeControllerFramework.Controllers.HomeController 则将使用命名空间 MyApplication.Controllers 中的一个。

    【讨论】:

    • 效果很好。我弄错的一件事是名称空间。我在没有Controllers 部分的情况下添加了它,这是一个问题。一旦我改变了使用整个命名空间的路线,它就开始完美地工作了。
    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多