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

Mat*_*nze 10 architecture asp.net iis asp.net-mvc asp.net-mvc-5

我试图确定在ASP.NET MVC 5中实现Uncle Bob的尖叫架构是否可能(或实际),而不是使用默认的文件夹结构.

以下是尖叫架构描述的链接:http://blog.8thlight.com/uncle-bob/2011/09/30/Screaming-Architecture.html

假设的文件夹结构看起来像这样:

  • 顾客
    • 控制器
      • CustomerController.cs
    • 楷模
      • Customer.cs
    • 查看
      • Index.cshtml
      • Details.cshtml
      • Update.cshtml
  • 雇员
    • 控制器
      • EmployeesController.cs
    • 楷模
      • Employee.cs
    • 查看
      • Index.cshtml
      • Details.cshtml
      • Update.cshtml
  • 共享
    • 查看
      • _Layout.cshtml
      • Error.cshtml
  • _ViewStart.cshtml
  • Web.config文件

相应的URL路由如下所示:

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

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

我的猜测是IIS明确阻止了到控制器索引方法的路由,因为URL与文件系统中的文件夹一致,默认情况下禁用目录浏览.但是,如果我启用目录浏览,它实际上需要我到实际的目录列表而不是路由到控制器的索引方法.

我可以将Customers和Employees文件夹移动到子文件夹中(即将它们移出根目录)并且一切正常,但我想尝试将这些文件夹保持在顶层(根据Screaming Architecture指南).

有没有人有这个问题的解决方案?

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

Sho*_*hoe 6

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

我周围挖路由配置,发现财产RouteExistingFilesRouteCollection,并认为这可能是工作.

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

因此,您需要做的就是将此属性设置为true,以便首先选择Asp.net路由而不是物理路由.

  • 很高兴听到.唯一的"缺点"应该是,当物理文件与映射路径在同一路径上时,您希望提供物理文件而不是动作.但是,想不到许多情况,你想要发生这种情况. (2认同)