Как создать 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 ответ
Несколько проблем, которые я могу видеть с вашей текущей маршрутизацией, поэтому я подробно изложил ниже вместе с рекомендациями для решения.
- В вашем примере все, что может понять механизм маршрутизации, это то, что вы пытаетесь создать URL для имени маршрута
AdminGroupsCreateStudent
, Механизм маршрутизации может подтвердить, что у него есть маршрут с именемAdminGroupsCreateStudent
, но затем при попытке сопоставить значения маршрута с параметрами невозможно продолжить, поскольку вы пытались передатьnull
и этот маршрут нуждается в параметреgroupId
чтобы добиться успеха, он возвращает маршрут со ссылкой на страницу, на которой вы находитесь. - Посредством создания параметра в середине 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
);