Asp.net mvc ASP.NET核心嵌套/分层控制器

Asp.net mvc ASP.NET核心嵌套/分层控制器,asp.net-mvc,asp.net-core,asp.net-routing,asp.net-mvc-controller,Asp.net Mvc,Asp.net Core,Asp.net Routing,Asp.net Mvc Controller,嗨,这里是人满为患的堆垛工!正在寻找有关在asp.net core中使用分层或嵌套控制器的帮助 到目前为止,与我所看到的不同,默认样板代码及其默认路由{controller=Home}/{action=Index}/{id?}只允许控制器位于默认的controllers目录中,而该目录根本不允许嵌套 从目前为止我所看到的情况来看,有几种方法可以解决这个问题,在我看来,这两种方法都不理想 Razor查看页面 在开箱即用的情况下,Razor Pages似乎会自动绕过此问题,因为.net核心会自动尝试

嗨,这里是人满为患的堆垛工!正在寻找有关在asp.net core中使用分层或嵌套控制器的帮助

到目前为止,与我所看到的不同,默认样板代码及其默认路由
{controller=Home}/{action=Index}/{id?}
只允许控制器位于默认的controllers目录中,而该目录根本不允许嵌套

从目前为止我所看到的情况来看,有几种方法可以解决这个问题,在我看来,这两种方法都不理想

  • Razor查看页面
  • 在开箱即用的情况下,Razor Pages似乎会自动绕过此问题,因为.net核心会自动尝试从关联的URL结构遍历相应的文件夹结构,以尝试查找与路由匹配的.cshtml文件

    问题出在哪里?这更像是MVVM模式,而不是MVC模式。在我看来,这三个弊病中哪一个比较小(开放讨论ofc)

  • 路线属性
  • 我看到的另一种选择是,可以使用控制器和操作上的Route属性将控制器与路由关联
    [Route(“parent/Route/path”)]

    问题出在哪里?相同的名称空间(文件夹)意味着不重用控制器名称,鉴于我们应用程序的性质,我们需要为控制器命名名称空间。更不用说它将使控制器文件夹变得庞大,包含100个控制器文件

  • 添加更多路线
  • 手动添加更多路由会很痛苦,因为我必须为文件夹结构中父级和子级的每个可能排列添加新路由

    虽然我理解这可能是我的预期做事方式。在我看来,在新路由中添加所有可能的嵌套文件夹是一种糟糕的设计。因为这是可以从文件夹结构的路由自动推断出来的。并自动在其他语言和框架中完成。(一个很好的C#类库示例)

    伤口中的盐

    最重要的是,显然不可能在两个完全不同的文件夹/路由中具有相同的命名控制器: . 当这种情况发生时,您会收到一个异常
    模糊usactionexception:多个操作匹配。

    对我来说,最大的痛点是在.NETMVC框架的正常版本中支持名称空间。出于某种原因,Microsoft的某个人已从
    MapRoute()
    方法中删除了名称空间参数。我不明白为什么会这样做

    不仅仅是一句咆哮

    在我继续之前,这篇文章不是我的抱怨或咆哮,我真的在寻找一个更好的解决方案,并在寻找其他的想法和选择。请继续阅读下面我的理想解决方案

    理想溶液

    由于我有PHP背景,我发现只需使用默认的
    spl\u register\u autoloader()
    即可满足我的需求。我可以注册我选择的特定名称空间,PHP可以查看我想要的控制器的本地目录文件夹结构中后续名称空间的任何和所有部分

    i、 e.PHP控制器
    Controllers\NestingLevel1\NestingLevel2\HomeController
    将在Controllers\NestingLevel1\NestingLevel2\HomeController.PHP中查找关联的控制器

    简单,美丽,我提到过简单吗

    总结

    是否有任何方法可以在ASP.NET core中获得嵌套控制器,而无需:

  • Razor视图页面(MVVM)
  • 每个嵌套控制器上的路由属性
  • 为每个可能的嵌套父/子组合手动添加路由

  • 控制器不必位于控制器文件夹中,它们可以位于ASP.NET Core中的任何位置。不过问题是好的,更像是我们如何根据应用程序中控制器的相对路径为其自动设置URL前缀。