Почему я получаю 404, когда маршрут совпадает? ASP.Net MVC - PullRequest
11 голосов
/ 16 мая 2011

Я застрял в этой проблеме на несколько часов.

У меня есть контроллер под названием 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);

    }
}

Так что я в тупике ..

Ответы [ 6 ]

12 голосов
/ 16 мая 2011

Убедитесь, что ваш класс контроллера называется DecisionPointController, а не DecisionPoint

11 голосов
/ 19 ноября 2013

Если ваш класс AreaRegistration и класс Controller не находятся в одном и том же пространстве имен, вы окажетесь в этой ситуации - маршрут будет совпадать (и RouteDebugger подтвердит это), но выполучите 404 по «правильному» URL.

Решение состоит в том, чтобы убедиться, что оба предложения находятся в одном и том же пространстве имен.

2 голосов
/ 14 октября 2015

Я только недавно столкнулся с этой же проблемой.Для меня проблема была в том, что у меня было два контроллера с одинаковым именем, если разные пространства имен (один был в области).

2 голосов
/ 24 июля 2014

Это может произойти из-за вашего Controller в другом проекте, который ссылается на другую версию System.Web.Mvc!

У меня были те же симптомы - правильный маршрут был найден, но получил 404! В HttpHandler.ProcessRequest было выдано исключение о том, что контроллер обработчика не реализует IController.

0 голосов
/ 28 января 2016

В моем случае ответ на ту же проблему был связан с необходимостью «включать в проект» соответствующие контроллеры и представления вместо неправильных правил маршрутизации.

Когда мои были созданы, они по какой-то причине не были автоматически включены. Эта проблема была обнаружена после того, как я закрыл и снова открыл решение.

{+ 1 ненависть}, присуждаемая Visual Studio за ее неисправную гиперавтоматизацию, заставляющую меня копаться в файлах Web.Config, пытаться взломать расширения и даже пытаться (и не удается) вызвать достойный ErrorController.

0 голосов
/ 16 мая 2011

Я не гуру маршрутов, но я всегда добавлял все параметры для аргумента по умолчанию:

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