【问题标题】:MVC Route conflicting with existing Folder causes 404MVC 路由与现有文件夹冲突导致 404
【发布时间】:2025-12-11 21:35:01
【问题描述】:

我确实看到了类似问题的答案,但没有一个适用于这种情况。

我有 MVC4 应用程序,其注册区域称为“设置”,带有一个“管理”控制器。我的 Web 项目中还有一个文件夹,其中包含名为“设置”的源,因此文件夹结构如下:

+ WebProjectFolder
     + Areas
          +Settings
               +Controllers
                    ManageController.cs
               + SettingsAreaRegistration.cs
               ...
     + Settings
          + SomeClasses.cs

ManageController 非常简单:

public class ManageController : Controller
{
    public ActionResult Index()
    {
        return Content("WORKS FINE!");
    }
}

区域注册也很简单:

public class SettingsAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Settings";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.Routes.IgnoreRoute("Settings/{*pathinfo}");
        context.Routes.RouteExistingFiles = false;

        context.MapRoute(
            "Settings_default",
            "Settings/{controller}/{action}/{id}",
            new {area = context.AreaName, controller="Manage", action = "Index", id = UrlParameter.Optional }
        );
    }
}

问题:

http://mysite/settings - 404 
http://mysite/settings/Manage - 404
http://mysite/settings/Manage/Index - 404

如果我删除行 "context.Routes.IgnoreRoute("Settings/{*pathinfo}");" 结果如下:

http://mysite/settings - 404
http://mysite/settings/Manage - WORKS FINE!
http://mysite/settings/Manage/Index - WORKS FINE!

仅当我删除/重命名现有文件夹“设置”时,结果才是正确的。 与文件夹命名相同的控制器的类似情况。

如何让MVC忽略已有文件夹,始终优先处理Controller?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


    【解决方案1】:

    我想你想将RouteExistingFiles 设置为true

    context.Routes.RouteExistingFiles = true;
    

    摘录:

    如果 ASP.NET 路由处理所有请求,即使是与现有文件匹配的请求,则为 true;否则为假。默认值为 false。

    【讨论】:

    • 设置 RouteExistingFiles = true 是路由的“核心选项”。这意味着我们路由所有匹配的请求,无论文件是否存在。 See this question