嗨,其他堆高车手!在asp.net核心中具有分层或嵌套控制器方面寻求帮助
到目前为止,默认样例代码及其默认路由{controller=Home}/{action=Index}/{id?}
仅允许将控制器放在默认的 Controllers 目录中,该目录不允许嵌套完全没有。
从目前为止我所看到的,有几种方法可以解决此问题,我认为这都不是理想的方法。
开箱即用,因为.net核心会自动尝试从关联的URL结构中遍历相应的文件夹结构以尝试找到 .cshtml 与路线匹配的文件。
有问题吗?与MVC模式相比,这更像是MVVM模式。在我看来,这三种邪恶中的哪一种较小,(有待讨论的问题)
我看到的另一种选择是可以使用控制器和操作[Route("parent/route/path")]
上的Route属性将控制器与路由相关联
有问题吗?相同的名称空间(文件夹)意味着不会重用Controller名称,并且鉴于我们应用的性质,我们需要为Controllers命名空间。更不用说它将使Controller文件夹变得庞大,可以容纳100个Controller文件。
手动添加更多路由会很痛苦,因为我必须为文件夹结构中父级和子级的每个可能排列添加新路由。
虽然我了解这可能是预期的处理方式。我认为,在新路径中添加每个可能的嵌套文件夹都是不好的设计。因为这是可以自动从路由推断到文件夹结构的东西。并且自动以其他语言和框架自动完成。 (一个出色的示例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中的嵌套控制器不存在: