当控制器名称与文件夹名称匹配时,MVC无法匹配默认操作?

时间:2014-02-17 23:25:35

标签: c# asp.net-mvc-routing asp.net-mvc-5 asp.net-mvc-controller

我遇到了一个奇怪的问题,试图为我的MVC项目建立一个非传统的文件夹结构:

\Franchises\Compliance\FeesPaid\FeesPaidController
\Franchises\Compliance\FeesPaid\Views\..
\Franchises\Compliance\FeesPaid\ViewModels\..

我的计划是在每个子文件夹中包含1个控制器,以及相关的views / viewmodels文件夹。我不希望有一个只包含一个类的/ Controllers /文件夹。

出于测试目的,我手动路由如下:

routes.MapRoute("whocares", "Franchises/Compliance/{controller}/{action}/{id}",
            new { controller = "FeesPaid", 
                  action = "Index", 
                  id = UrlParameter.Optional });

我遇到了神秘的行为。这些URL正确路由:

http://localhost:12345/Franchises/Compliance/FeesPaid/Index
http://localhost:12345/Franchises/Compliance/FeesPaid/Index/123

但是此URL失败并显示“Web服务器配置为不列出此目录的内容”错误:

http://localhost:12345/Franchises/Compliance/FeesPaid

我发现这只发生在Controller名称与文件夹名称匹配时(减去“* Controller”)。因此,将控制器名称捏造成其他东西可以使其工作:

\Franchises\Compliance\FeesPaid\FeesPaidXController

http://localhost:12345/Franchises/Compliance/FeesPaidX
http://localhost:12345/Franchises/Compliance/FeesPaidX/Index
http://localhost:12345/Franchises/Compliance/FeesPaidX/Index/123

为什么控制器&具有匹配名称的文件夹会导致URL依赖于默认操作& ID?

修改

经过调查,事实证明IIS正在将请求路由到DirectoryListingModule而不是MVC,因此它甚至没有达到MVC路由。

我试过以下无济于事:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"  >  <--- attribute added
    <remove name="FormsAuthenticationModule"/>
  </modules>
</system.webServer>

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"  >
    <remove name="FormsAuthenticationModule"/>
    <remove name="DirectoryListingModule"/>    <--- Fails to start web app with "lock violation"
  </modules>
</system.webServer>

如何强制IIS将这些请求路由到MVC而不是DirectoryListingModule?最好在没有IIS配置更改的情况下,我可能无法控制生产。

1 个答案:

答案 0 :(得分:0)

感谢大家的评论。

进一步的调查让我在这里发布另一个问题:

How to disable or reprioritize IIS DirectoryListingModule under MVC module?