MVC Handle 404s и установить страницу ошибок по умолчанию - PullRequest
1 голос
/ 02 января 2011

Я пытаюсь включить маршрутизацию по умолчанию в MVC.

Я хочу, чтобы каждый запрос 404 перенаправлялся в DefaultController DefaultRout ()

Я нашел Как я могу сделать перехватвесь маршрут для обработки запросов «404 страница не найдена» для ASP.NET MVC?

Но {* url} не работает, я получаю 404 и не перенаправляю на страницу по умолчанию.

Мой код:

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

  //http://localhost:4775/BW/A/Tasks
  routes.MapRoute("Pages", "A/{controller}", new { controller = "Tasks", action = "InitPage" });

  routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "Default", action = "DefaultRout" }
  );
}

Что мне не хватает?

Спасибо

Рафаэль

Ответы [ 2 ]

6 голосов
/ 02 января 2011

Вы не можете использовать ваш web.config? Я думаю, что это будет проще:

<customErrors mode="On" defaultRedirect="/error/default">
  <error statusCode="403" redirect="/error/restricted"/>
  <error statusCode="404" redirect="/Default/DefaultRoute"/>
  <error statusCode="500" redirect="/error/problem"/>
</customErrors>
0 голосов
/ 02 января 2011

Есть несколько вещей, на которые я хотел бы указать.

Я заметил, что вы использовали много записей IgnoreRoute для физических файлов.Вам не нужно этого делать, так как каркас ищет физические файлы, соответствующие URL-адресу по умолчанию, прежде чем маршрутизировать его.Вы можете отключить сопоставление физического файла, установив для RouteExistingFiles значение true в коллекции RouteCollection в Global.asax.В этом случае вы этого не сделали.

Во-вторых, как вы его настроили, любой маршрут, кроме / A / {controller}, будет пойман перехватить весь маршрут (все, что начинается с *, этоперехватить все маршруты), которые вы настроили.

Я пробовал эту конфигурацию, и она перехватывает все другие маршруты, кроме упомянутого выше.Однако следует помнить одну вещь: указанная выше конфигурация будет по-прежнему сопоставлять все со следующим типом URL: / A / что-то /, поскольку второй сегмент всегда будет соответствовать заполнителю {controller}.Чтобы сопоставить этот URL-адрес только с контроллером «Задачи», вы можете определить ограничение на маршрут следующим образом:

routes.MapRoute("Pages", "A/{controller}", new { controller = "Tasks", action = "InitPage" }, new {controller="Home"});

В вашей конфигурации перехвата всех маршрутов также есть орфографическая ошибка.action = "DefaultRout" должно быть action = "DefaultRoute"

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...