我在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" }
);
当 im 在带有 iri 的页面上时:
管理员/组/1
有一个路由链接:
@Html.RouteLink("Add", routeName: "AdminGroupsCreateStudent", routeValues: null, htmlAttributes: new { @class = "btn btn-success" })
但是当我单击它时,asp.net 将使用名称"管理员组编辑"进行路由。 如何创建路由链接以转到名称为"AdminGroupsCreateStudent"的路由?如果我需要传递 groupId 抛出路由值,那么我如何从 Uri 获取它?
我可以看到您当前路由方式的几个问题,因此我在下面详细介绍了要解决的建议。
- 在您的示例中,路由引擎能够理解的只是您尝试创建路由名称的 URL
AdminGroupsCreateStudent
。路由引擎能够确认它有一个名为AdminGroupsCreateStudent
的路由,但是当尝试将路由值与参数匹配时,它无法继续,因为您尝试传递null
并且此路由需要参数groupId
才能成功,因此它返回引用您所在页面的路由。 - 通过在 URL 的中途创建参数,路由引擎 需要路由的值才能成功呈现。可悲的是,即使尝试为
groupId
参数分配值UrlParameter.Optional
,您仍然会在运行时遇到相同的问题,因为引擎再次无法对 Url 中间的null
参数做任何事情,因为它聪明地知道它会断开链接,这就是参数放在末尾或具有默认值的原因。
我的建议是执行以下操作之一:
将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
);