我已经被困在这个问题上几个小时了。
我有一个名为'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);
}
}
所以我很难过..
答案 0 :(得分:12)
确保您的控制器类名为DecisionPointController而不是DecisionPoint
答案 1 :(得分:11)
如果您的AreaRegistration
类和Controller
类不在同一名称空间中,您将处于这种情况 - 路由将匹配(并且RouteDebugger将确认此情况)但是您将在“正确的”网址上获得404.
解决方案是确保两个clases在同一名称空间中。
答案 2 :(得分:2)
答案 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。