Почему RedirectToRoute ("Default") не перенаправляет в корень? - PullRequest
2 голосов
/ 20 октября 2010

С учетом этих маршрутов:

routes.MapRoute("Test", "test", new { controller = "Test", action = "Index" });
routes.MapRoute("Default", "{controller}/{action}/{id}", 
  new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Если я вызываю RedirectToRoute ("Default") из действия Index у TestController, он перенаправляет на /test, но я ожидал, что он перенаправит на /

Я проверил результат вызова RedirectToRoute («По умолчанию») перед его возвратом во время сеанса отладки.

Результат RedirectToRouteResult = RedirectToRoute («По умолчанию»);

У него есть свойствоRouteName со значением «Default» и свойством RouteValues ​​без элементов (Count = 0).Я проверил с помощью Reflector, и null передается внутренне как RouteValueDictionary.

Опять же, я ожидаю, что с учетом значений по умолчанию для маршрута, определенного в моем приложении, он будет перенаправлен в представление Index на HomeController.

Почему он не перенаправляет на /?

Ответы [ 3 ]

6 голосов
/ 22 октября 2010

RouteValueDictionary, заполненный текущим действием, используется для заполнения Controller, Action, ID. Обычно это та функция, которая вам нужна, и она позволяет вам выполнять такие действия, как <%:Html.ActionLink("MyAction")%>, без необходимости указывать контроллер в представлении.

Для принудительного восстановления по умолчанию просто используйте:

RedirectToRoute("default", null");

Второй аргумент - для ваших значений маршрута, и, указав его, вы переопределяете ранее существующие значения.

Однако я бы сказал, что предпочтительнее было бы иметь маршрут Home, который не будет принимать никаких параметров. Это означает, что ваши перенаправления не будут нуждаться в загрузке нулей, плавающих вокруг, и вызов RedirectToRoute("Home") также хорош и явен.

Редактировать

Это действительно старый ответ, и, как упомянули несколько человек, похоже, не работает на них. Что бы это ни стоило, я сейчас не использую этот шаблон и явно переопределяю контроллер и область, когда мне нужно вырваться. Мало того, что он, очевидно, работает лучше, но когда вы возвращаетесь к коду, хорошо ясно видеть, что вы выходите из этого контекста и хотите очистить определенные значения маршрута.

Для справки, я также склонялся к генерации URL на основе именованных маршрутов по сравнению с генерацией на основе соглашений.

3 голосов
/ 26 марта 2015

Я не думаю, что «нулевой» параметр, о котором упоминает Чао, работал для меня. Возможно, это было в предыдущих версиях MVC, но теперь в MVC 5.2 это единственный способ заставить его работать:

RedirectToRoute("Default", new { controller = "", action = "" });
2 голосов
/ 20 октября 2010

Не глядя на реальный код, чтобы увидеть, что происходит, может быть немного сложно понять почему, но этот пост forum действительно проливает некоторый свет. Ответчик говорит, что под прикрытием он может создать RouteValueDictionary, который будет содержать контроллер и действие, в котором вы находитесь в данный момент, который в вашем случае будет контроллером Test и действием Index. Затем при вызове RedirectToRoute("Default") контроллер и действие в RouteValueDictionary будут использоваться при сопоставлении маршрута по умолчанию, и вы перейдете к действию Index в вашем тестовом контроллере.

Теперь вы всегда можете сделать Redirect("/"), чтобы перейти на главную страницу вашего сайта.

...