Ответ 1
Убедитесь, что ваш класс контроллера называется DecisionPointController, а не DecisionPoint
Я застрял в этом вопросе в течение нескольких часов.
У меня есть контроллер под названием "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);
}
}
Итак, я в тупике.
Убедитесь, что ваш класс контроллера называется DecisionPointController, а не DecisionPoint
Если ваш класс AreaRegistration
и Controller
не находятся в одном пространстве имен, вы будете в этой ситуации - маршрут будет соответствовать (и RouteDebugger подтвердит это), но вы получите 404 на "правильном" URL-адресе.
Решение состоит в том, чтобы убедиться, что обе классы находятся в одном пространстве имен.
Вы можете использовать RouteDebugger для проверки вашего маршрута.
http://helios.ca/2009/05/26/aspnet-mvc-route-debugging/
Это было очень полезно для меня.
Это может произойти из-за того, что ваш Controller
находится в другом проекте, который ссылается на другую версию System.Web.Mvc
!
У меня были те же симптомы - был найден правильный маршрут, но он получил 404! В HttpHandler.ProcessRequest было сделано исключение, говорящее, что контроллер обработчика не реализует IController
.
Недавно я столкнулся с этой проблемой. Для меня проблема заключалась в том, что у меня было два контроллера с тем же именем, если разные пространства имен (один был в области).
Я не гуру маршрутов, но я всегда добавлял все параметры для аргумента по умолчанию:
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 ненависть}, присужденная Visual Studio за ее ошибочную гипер-автоматизацию, отправив мне копать файлы Web.Config, пытаясь зацепиться за расширения, и даже пытаться (и терпеть неудачу) взломать приличный ErrorController.