ASP.NET Core嵌套/分层控制器

时间:2019-03-20 05:29:40

标签: asp.net-mvc asp.net-core asp.net-routing asp.net-mvc-controller

嗨,其他堆高车手!在asp.net核心中具有分层或嵌套控制器方面寻求帮助

到目前为止,默认样例代码及其默认路由{controller=Home}/{action=Index}/{id?}仅允许将控制器放在默认的 Controllers 目录中,该目录不允许嵌套完全没有。

从目前为止我所看到的,有几种方法可以解决此问题,我认为这都不是理想的方法。

  1. 剃刀查看页面

开箱即用,因为.net核心会自动尝试从关联的URL结构中遍历相应的文件夹结构以尝试找到 .cshtml 与路线匹配的文件。

有问题吗?与MVC模式相比,这更像是MVVM模式。在我看来,这三种邪恶中的哪一种较小,(有待讨论的问题)

  1. 路由属性

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

有问题吗?相同的名称空间(文件夹)意味着不会重用Controller名称,并且鉴于我们应用的性质,我们需要为Controllers命名空间。更不用说它将使Controller文件夹变得庞大,可以容纳100个Controller文件。

  1. 添加更多路线

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

虽然我了解这可能是预期的处理方式。我认为,在新路径中添加每个可能的嵌套文件夹都是不好的设计。因为这是可以自动从路由推断到文件夹结构的东西。并且自动以其他语言和框架自动完成。 (一个出色的示例C#类库)

伤口上的盐

最重要的是,显然不可能在两个完全分开的文件夹/路径中具有相同的命名控制器: How to use same controller name in different namespaces。发生这种情况时,您会遇到异常AmbiguousActionException: Multiple actions matched.

对我来说最大的麻烦是.NET MVC Framework的常规版本中支持命名空间。由于某些妙妙的原因,Microsoft的某人已从MapRoute()方法中删除了namespace参数。为什么这样做会my不休?

不是“只是”一个狂暴

在我继续之前,这篇文章不是我的抱怨或抱怨,我是在真诚地寻找更好的解决方案,并在寻找其他想法和替代方案。请继续阅读以下我理想的解决方案。

理想解决方案

由于我来自PHP背景,因此我发现仅使用默认的 spl_register_autoloader() 即可满足我的需求。对于我来说,我可以注册自己选择的特定名称空间,而PHP可以在我想要的Controller的本地目录文件夹结构中查看后续名称空间的所有部分。

即PHP控制器Controllers\NestingLevel1\NestingLevel2\HomeController会在 Controllers \ NestingLevel1 \ NestingLevel2 \ HomeController.php

中查找关联的控制器

简单,美丽,我是否提到简单?

总结

有没有什么方法可以使ASP.NET Core中的嵌套控制器不存在:

  1. 剃刀查看页面(MVVM)
  2. 每个单个嵌套控制器上的路由属性
  3. 为每种可能的嵌套父母/孩子组合手动添加路线

0 个答案:

没有答案