Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Принцип организации маршрутов (роутов) в ASP MVC 4

Всем привет, есть такой вот роут
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add("", new Route("{action}/{controller}", new MvcRouteHandler())); routes.MapRoute( name: "", url: "{controller}/{action}", defaults: new { controller = "Home", action = "Index" } ); }
в первом добавлении идет {action}/{controller}, а во втором наоборот {controller}/{action} вопрос в том, что при отправке запроса такого типа http://localhost:3373/home/index?Name=Vasya&Message=Gleb выдается ошибка, так как почему-то приложение использует роут №1, добавление во второй роутер слова Default дела не меняет, зато если удалить первый роут, тогда все работает отлично. Почему так и по по какому принципу он решает какой роут будет дефолтным если не указываются имена роутов ?


Ответ

Маршруты обрабатываются строго в порядке их добавления. Как только будет найден подходящий маршрут, он используется и дальнейший поиск подходящего маршрута не выполняется.
Адрес http://localhost:3373/home/index содержит две секции, поэтому подходит под первый шаблон.
Вы пишете:
добавление во второй роутер слова Default дела не меняет
Вы видимо вот об этой строчке:
defaults: new { controller = "Home", action = "Index" }
Здесь слово defaults не означает что этот маршрут надо использовать как дефолтный, оно указывает какие значения подставить в переменные в шаблоне маршрута, если они вдруг пусты. То есть если вы используете только второй маршрут, то адрес
/ будет интерпретироваться как /Home/Index /Home тоже будет интерпретироваться как /Home/Index
То есть, если в маршруте нет какой-то секции, будет использовано указанное вами дефолтное значение для этой секции.
В вашем случае адрес home/index подходит уже под первый ваш маршрут, поэтому до анализа второго маршрута дело даже не доходит.

Комментариев нет:

Отправить комментарий