ASP.NET MVC 5 中的自定义文件夹结构

Custom Folder Structure in ASP.NET MVC 5

我正在尝试确定是否有可能(或实用)在 ASP.NET MVC 5 中实现鲍勃大叔的尖叫架构而不是使用默认文件夹结构。

这里有一个 link 对尖叫建筑的描述:http://blog.8thlight.com/uncle-bob/2011/09/30/Screaming-Architecture.html

假设的文件夹结构如下所示:

根目录

相应的 URL 路由如下所示:

我创建了自定义 RazorViewEngine 并添加了适当的视图位置格式(例如“~/{1}/Views/{0}.cshtml”)和部分视图位置格式(例如“~/Shared/Views/{0}.cshtml")。我还将共享 _ViewStart.cshtml 移动到根目录,并将 Views/Shared 文件夹的 web.config 与根级别 web.config 合并,以避免在所有目录中复制这两个文件查看文件夹。

一切正常,但是,如果我尝试导航到索引页面(例如 http://www.example.com/employees/),我会收到 403.14 错误(禁止访问)。所有其他路线(包括 http://www.example.com/employees/index)工作正常。

我的猜测是 IIS 明确阻止了到控制器索引方法的路由,因为 URL 与文件系统中的文件夹重合,并且默认情况下目录浏览被禁用。但是,如果我启用目录浏览,它实际上会将我带到实际的目录列表,而不是路由到控制器的索引方法。

我可以将 Customers 和 Employees 文件夹移动到一个子文件夹中(即将它们移出根文件夹)并且一切正常,但我想尝试将这些文件夹保持在顶层(根据尖叫架构指南)。

有没有人能解决这个问题?

请注意,MVC 区域不是我正在寻找的解决方案,因为它不允许上述文件夹结构(即以高级用例命名的顶级文件夹和直接包含在视图中的视图文件夹而不是子文件夹)。

我敢打赌您对 IIS 的看法是正确的。如果您有两个路径映射到同一资源,则首先在 IIS 端检查物理路径。

我正在研究路由配置并在 RouteCollection 上找到了 属性 RouteExistingFiles,我认为这可行。

我将值设置为 true 并使用项目中的空文件夹在本地进行测试,路由重定向到 Home/Index,然后导航到 localhost:xxx/MyFolder。它工作正常。

那么您需要做的就是将此 属性 设置为 true 以使其首先选择 Asp.net 路由而不是物理路由。