Почему этот маршрут MVC не работает? - PullRequest
10 голосов
/ 24 марта 2009

вот два маршрута из моего файла global.asax. Я пытаюсь перейти ко второму маршруту и ​​получаю ошибку по умолчанию ресурса 404. Не найдено.

Когда я удаляю первый маршрут (указанный в этом примере), он работает.

Как я могу это исправить, пожалуйста?

Фрагмент кода global.asax

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 });

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });

Ответы [ 4 ]

20 голосов
/ 24 марта 2009

Ваш первый маршрут является "жадным" маршрутом и с радостью примет "create" в качестве alertId в последнем параметре. Похоже, что вы хотите, чтобы параметр alertId был только числовым, поэтому вы должны добавить ограничение, чтобы сообщить системе маршрутов, что последний параметр должен быть числовым.

См. учебник .

Например:

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 },
    new { alertId = @"\d+" });

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });

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

1 голос
/ 24 марта 2009

Если у вас есть еще одна проблема, как это, попробуйте отладчик URL Фила Хаака в http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

1 голос
/ 24 марта 2009

Вы хотите, чтобы маршруты были определены наоборот, чтобы точное совпадение на create предшествовало неограниченному совпадению для alertId. Это, или вы можете добавить ограничение к alertId, как указано в Twisty Maze.

Это потому, что маршрутизация работает, пытаясь сопоставить маршруты сверху вниз. /user/PureKrome/Alert/create соответствует маршруту User-Alert-Details, так как create является значением для alertId. При их переключении он будет совпадать с маршрутом User-Alert-Create, только если 4-й сегмент явно равен create, и будет падать до User-Alert-Details, если не будет.

Для ясности, они должны работать следующим образом:

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 });  
0 голосов
/ 03 августа 2016

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

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

Так на самом деле, когда вы говорите http://localhost/SomeRoute Первый преобразователь вступает в действие и рассматривает строку «SomeRoute» как имя контроллера, затем он не находит действие, поэтому он использует заданное вами действие по умолчанию, которое в вашем примере - «AlertCreate». Теперь маппер пытается найти действие с именем AlertCreate в контроллере SomeRoute.

Суть в том, что второе сопоставление не запускается, потому что первое сопоставление обрабатывает все ваши запросы маршрутизации. (потому что у вас указаны значения по умолчанию)

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