Razor asp路由-{value}标记帮助程序不考虑路由模板
我正在.net core 2.0中开发一个面包屑实现 要求是能够创建一个层次菜单,在那里前面的面包屑项目将采取的家长等 该实现基于面包屑ViewComponent模型,该模型读取当前路线数据,并将参数作为面包屑链接的一部分嵌入为标记帮助器(asp路线-{value}) 问题: 我有两个问题:Razor asp路由-{value}标记帮助程序不考虑路由模板,razor,asp.net-core-mvc,.net-core,asp.net-core-mvc-2.0,Razor,Asp.net Core Mvc,.net Core,Asp.net Core Mvc 2.0,我正在.net core 2.0中开发一个面包屑实现 要求是能够创建一个层次菜单,在那里前面的面包屑项目将采取的家长等 该实现基于面包屑ViewComponent模型,该模型读取当前路线数据,并将参数作为面包屑链接的一部分嵌入为标记帮助器(asp路线-{value}) 问题: 我有两个问题: 面包屑组件Razor视图中的ViewContext.RouteData.Values不包含应该作为查询字符串参数传递的键“id” 即使出于测试目的我硬编码了上面的代码,使用asp路由id将其注入Razor视
http://127.0.0.1:5100/XXX/Service/{item_id}/Hardware/UpdateOrder?orderId={order_id}
对于上一个面包屑,它应该生成
http://127.0.0.1:5100/XXX/Service/{item_id}/Hardware/Detail?orderId={order_id}
Id是GUID
Startup.asp中的路由模板
routes.MapRoute(
name: "areaRouteWithWholesaleCustomerCodeAndTargetId",
template: "{wholesaleCustomerCode}/{area:exists}/{baseItemId:guid}/{controller=Home}/{action=Index}/{id:guid?}"
);
面包屑视图组件Razor视图:
@model BreadcrumbModel
<ul class="list-unstyled breadcrumbs" id="breadcrumbs">
@{
var baseItemId = ViewContext.RouteData.Values["baseItemId"] ?? "";
var id = ViewContext.HttpContext.Request.QueryString.Value ?? "";
id = "orderid=testid-123";
}
@foreach(var li in Model.Breadcrumb)
{
<li>
<a asp-area="@li.AreaName" asp-controller="@li.ControllerName" asp-action="@li.ActionName" class="@li.Class" asp-route-baseItemId="@baseItemId" asp-route-id="@id">
@li.DisplayName
</a>
</li>
}
</ul>
@model面包屑模型
@{
var baseItemId=ViewContext.RouteData.Values[“baseItemId”]??“;
var id=ViewContext.HttpContext.Request.QueryString.Value;
id=“orderid=testid-123”;
}
@foreach(模型中的变量li.Breadcrumb)
{
-
ViewContext.HttpContext.Request.QueryString值:
使用asp route-{value}标记帮助器,我将2个id注入到锚标记中,baseItemId是路由映射的一部分,id也是路由映射的一部分,但作为查询字符串
呈现菜单时,这是我在面包屑上得到的结果:
<a class="" href="/XXX/Service/Hardware/Detail/orderid%3DtestId-123?baseItemId=09185d87-5e3f">
Hardware
</a>
不知何故,它根本不尊重路由模板
我希望它的表现如下:
硬件
预期行为:
我本以为它会按如下方式工作:
- 我应该能够从路由值中获取值“id”,而不是依赖于查询字符串参数
- 在基于文档注入2个id时,它们应该出现在路由模板中定义的各自位置,baseItemId首先作为路由的一部分,然后id作为最后一个操作的查询字符串部分
对此有什么建议或见解吗?它正按照您告诉它的方式进行操作。您正在将
id
设置为查询字符串,或者只需将orderId=test123
。因此,它会将该字符串塞进路由的id
部分(在转义=
符号时,因为它在URI的该部分无效)。如果希望orderId
作为查询字符串的一部分,则应该做的是将其作为路由参数传递:asp route orderId=“@orderId”
只要您的baseItemId
没有进入路由,就很可能有另一个正在匹配的路由,它不包括这个参数路由短路,因此它总是选择它可以匹配的最不特定的路由,然后将它不需要的任何其他路由转储为查询字符串。您应该更改或使用自定义命名路由来消除歧义
如果这不是问题所在,那么唯一的另一种可能性是guid
对baseItemId
的约束在某种程度上不能通过为该参数传递的内容得到满足。它完全按照您的要求执行。您正在将id
设置为查询字符串,或者简单地将orderId=test123
设置为r结果,它将该字符串塞进路由的id
部分(同时转义=
符号,因为它在URI的该部分无效)。如果希望orderId
作为查询字符串的一部分,则应该做的是将其作为路由参数传递:asp-route-orderId=“@orderId”
只要您的baseItemId
没有进入路由,就很可能有另一个正在匹配的路由,它不包括这个参数路由短路,因此它总是选择它可以匹配的最不特定的路由,然后将它不需要的任何其他路由转储为查询字符串。您应该更改或使用自定义命名路由来消除歧义
如果这不是问题所在,唯一的另一种可能是guid
对baseItemId
的约束在某种程度上不满足于您为该参数传递的内容。谢谢-这帮助了它-我昨天确实尝试了asp route orderId,但我想我可能错过了一些内容,因为我认为它提供了相同的URL资源ult-是的,无论出于什么原因,它匹配了错误的路由-更改为asp路由orderId工作得非常好谢谢-这帮了忙-我昨天确实尝试了asp路由orderId,但我想我可能错过了一些东西,因为我认为它给出了相同的URL结果-是的,无论出于什么原因,它匹配了错误的路由-更改d到asp路由orderId工作正常