Как создать RouteLink с пользовательскими маршрутами, зарегистрированными в конфигурации маршрута?

У меня есть эти маршруты в RouteConfig:

routes.MapRoute(
                name: "AdminGroupsEdit",
                url: "admin/groups/{id}",
                defaults: new { controller = "Group", action = "Edit" }
            );
routes.MapRoute(
                name: "AdminGroupsEditStudent",
                url: "admin/groups/{id}/students/{studentid}",
                defaults: new { controller = "Student", action = "Edit" }
            );
routes.MapRoute(
                name: "AdminGroupsCreateStudent",
                url: "admin/groups/{groupId}/students/create-student",
                defaults: new { controller = "Student", action = "Create" }
            );

Когда я на странице с iri:

администратор / группы /1

есть RouteLink:

@Html.RouteLink("Add", routeName: "AdminGroupsCreateStudent", routeValues: null, htmlAttributes: new { @class = "btn btn-success" })

Но когда я нажал на нее, asp.net отправился в маршрут с именем "AdminGroupsEdit". Как я могу создать RouteLink для перехода к маршруту с именем "AdminGroupsCreateStudent"? Если мне нужно передать groupId, бросить routeValues, так как я могу получить его от Uri?

1 ответ

Решение

Несколько проблем, которые я могу видеть с вашей текущей маршрутизацией, поэтому я подробно изложил ниже вместе с рекомендациями для решения.

  1. В вашем примере все, что может понять механизм маршрутизации, это то, что вы пытаетесь создать URL для имени маршрута AdminGroupsCreateStudent, Механизм маршрутизации может подтвердить, что у него есть маршрут с именем AdminGroupsCreateStudent, но затем при попытке сопоставить значения маршрута с параметрами невозможно продолжить, поскольку вы пытались передать null и этот маршрут нуждается в параметре groupId чтобы добиться успеха, он возвращает маршрут со ссылкой на страницу, на которой вы находитесь.
  2. Посредством создания параметра в середине URL-адреса механизм маршрутизации ожидает, что значение маршрута будет успешно отображено. К сожалению, даже пытаясь назначить groupId параметр со значением UrlParameter.Optional, Вы по-прежнему сталкивались бы с той же проблемой во время выполнения, так как еще раз двигатель не сможет ничего сделать с null Параметр в середине URL, так как он знает, что разорвет связь, и является причиной того, что параметры помещаются в конец или имеют значения по умолчанию.

Я рекомендую сделать одно из следующего:

добавлять groupId до конца маршрутов Url и установите значение по умолчанию UrlParameter.Optional,

 routes.MapRoute(
                name: "AdminGroupsCreateStudent",
                url: "admin/groups/students/create-student/{groupId}",
                defaults: new { controller = "Student", action = "Create", groupId = UrlParameter.Optional }
            );

Или, если вам нужен этот URL, просто установите значение по умолчанию для groupId обращаться с null а затем управлять логикой для этого значения в Create действие.

routes.MapRoute(
                name: "AdminGroupsCreateStudent",
                url: "admin/groups/{groupId}/students/create-student",
                defaults: new { controller = "Student", action = "Create", groupId = 0 } //0 == Unknown
            );
Другие вопросы по тегам