为什么我在路线匹配时得到404? ASP.Net MVC

时间:2011-05-16 01:35:20

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

我已经被困在这个问题上几个小时了。

我有一个名为'DecisionPoint'的控制器,我在它的'ApplicationState'动作上设置了一个断点。无论我尝试什么,我都会在浏览器中获得404。我怀疑我的路线不正确,所以我下载了一个路由调试器,它将我正在尝试的URL与Controller和动作相匹配。那么为什么我会得到一个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**

我创建了一个全新的控制器,它可以工作。这是我的路线表的样子。状态控制器correclty路由到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);

    }
}

所以我很难过..

8 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:11)

如果您的AreaRegistration类和Controller类不在同一名称空间中,您将处于这种情况 - 路由将匹配(并且RouteDebugger将确认此情况)但是您将在“正确的”网址上获得404.

解决方案是确保两个clases在同一名称空间中。

答案 2 :(得分:2)

您可以使用RouteDebugger检查路线。

http://helios.ca/2009/05/26/aspnet-mvc-route-debugging/

对我来说非常有用。

答案 3 :(得分:2)

这可能是由于您的Controller在另一个引用System.Web.Mvc的不同版本的项目中而发生的!

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

笨蛋,但它吸引了我: 确保您的控制器继承自Controller

答案 6 :(得分:0)

我不是路线大师,但我总是为默认参数添加所有参数:

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
);

答案 7 :(得分:0)

在我的情况下,同一问题的答案是需要"包括在项目"相关的控制器和视图,而不是错误的路由规则。

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

{+ 1 hate}授予Visual Studio错误的超自动化,让我通过Web.Config文件挖掘,试图解决扩展问题,甚至试图(并且失败)掀起一个不错的ErrorController。