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