Как создать RouteLink с пользовательскими маршрутами, зарегистрированными в конфигурации маршрута? - PullRequest
0 голосов
/ 20 мая 2018

У меня есть следующие маршруты в 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:

admin / groups / 1

тамтакое RouteLink:

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

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

1 Ответ

0 голосов
/ 20 мая 2018

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

  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
            );
...