为什么当路由匹配时我收到 404? ASP.Net MVC

问题描述 投票:0回答:9

我已经被这个问题困扰了好几个小时了。

我有一个名为“DecisionPoint”的控制器,并且在其“ApplicationState”操作上设置了一个断点。无论我如何尝试,我都会在浏览器中收到 404 错误。我怀疑我的路线不正确,所以我下载了一个路线调试器,它会将我尝试的 URL 与控制器和操作相匹配。那么为什么我会得到 404 并且从未看到断点命中?

/DecisionPoint/ApplicationState/no/worky --> 404

控制器:

 public ActionResult ApplicationState(string fileName, string stateString)
        {
            string filePath = GetDpFilePath(fileName);
            HtmlDocument htmlDocument = new HtmlDocument();
            htmlDocument.Load(filePath);
            HtmlNode stateScriptNode =
                htmlDocument.DocumentNode.SelectSingleNode("/html/head/script[@id ='applicationState']");
            stateScriptNode.InnerHtml = "var applicationStateJSON =" + stateString;
            htmlDocument.Save(filePath);

            return Json("State Updated");

路线

 routes.MapRoute(
        "DecisionPointState", // Route name
        "DecisionPoint/ApplicationState/{fileName}/{stateString}", // URL with parameters
        new {controller = "DecisionPoint", action = "ApplicationState"} // Parameter defaults
    );


        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );


        }`
**Update**

我创建了一个全新的控制器并且它可以工作。这就是我的路由表现在的样子。状态控制器正确路由到 SaveState

 public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
           "StateRoute", // Route name
           "State/SaveState/{file}/{state}", // URL with parameters
           new { controller = "State", action = "SaveState", file = UrlParameter.Optional, state = UrlParameter.Optional } // Parameter defaults
       );

        routes.MapRoute(
           "DPStateRoute", // Route name
           "DecisionPoint/ApplicationState/{file}/{state}", // URL with parameters
           new { controller = "DecisionPoint", action = "ApplicationState", file = UrlParameter.Optional, state = UrlParameter.Optional } // Parameter defaults
       );


        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
       // RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);

    }
}

所以我很困惑..

asp.net asp.net-mvc asp.net-mvc-routing
9个回答
12
投票

确保您的控制器类名为 DecisionPointController 而不是 DecisionPoint


11
投票

如果您的

AreaRegistration
类和
Controller
类不在同一个命名空间中,您将处于这种情况 - 路由将匹配(并且 RouteDebugger 将确认这一点),但您会在“正确的”网址。

解决方案是确保两个类位于同一命名空间中。


3
投票

愚蠢,但它让我: 确保您的控制器继承自

Controller


3
投票

我失踪了

app.MapControllers();

在我的program.cs中(.NET 6及以上版本)


2
投票

发生这种情况可能是因为您的

Controller
位于另一个项目中,该项目引用了不同版本的
System.Web.Mvc

我也有同样的症状 - 找到了正确的路线,但得到了 404!在 HttpHandler.ProcessRequest 上,抛出异常,表示处理程序的控制器未实现

IController


2
投票

我最近也遇到了同样的问题。对我来说,问题是我有两个具有相同名称的控制器,如果命名空间不同(一个位于一个区域中)。


1
投票

我不是路由专家,但我总是为默认参数添加所有参数:

routes.MapRoute(
    "DecisionPointState", // Route name
    "DecisionPoint/ApplicationState/{fileName}/{stateString}", // URL with parameters
    new {controller = "DecisionPoint", 
         action = "ApplicationState"
         fileName = UrlParameter.Optional,
         stateString = UrlParameter.Optional
     } // Parameter defaults
);

1
投票

就我而言,同一问题的答案是需要“包含在项目中”相关的控制器和视图,而不是不正确的路由规则。

当我的创建时,由于某种原因它们没有自动包含在内。我关闭并重新打开解决方案后发现了这个问题。

{+1 恨}授予 Visual Studio,因为它有缺陷的超自动化让我深入研究 Web.Config 文件,尝试添加扩展,甚至尝试(但失败)创建一个像样的 ErrorController。


0
投票

另请注意,控制器类必须具有 public 访问修饰符。我将我的控制器写为:

[ApiController]
[Route("[controller]")]
class HomeController : ControllerBase
{
    ...
}

并且由于类的默认修饰符是 internal,因此该控制器中的所有操作都不匹配任何路由。

© www.soinside.com 2019 - 2024. All rights reserved.