asp-route-{value} 标签助手不遵守路由模板
asp-route-{value} tag helper not respecting route template
我正在 .net core 2.0 中实现面包屑导航,
要求是能够创建分层菜单,其中上一个面包屑项将带到父项等等...
该实现基于面包屑 ViewComponent 模型,该模型读取当前路线数据并将参数作为标记助手嵌入到面包屑链接中(asp-route-{value})
问题:
我有两个问题:
- 面包屑组件的 Razor 视图中的 ViewContext.RouteData.Values 不包含应该作为查询字符串参数传递的键 "id"
- 即使我出于测试目的对上面的代码进行硬编码,使用 asp-route-id 将其注入到 Razor 视图中的锚选项卡中 - 不会在末尾将其作为查询字符串参数注入动作,但在动作之后将其作为“{controller}/{action}/{id}”插入
这是来自浏览器的 URL:
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>
ViewContext.RouteData 中可用的数据 - 请注意,没有 id 作为路线数据的一部分传递 -
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
未进入路线而言,很可能还有另一条路线正在匹配,其中不包括此参数。路由短路,所以它总是会选择它可以匹配的最不具体的路由,然后只转储它不需要的任何其他内容作为查询字符串。您应该更改路由的顺序或改用自定义命名路由,以消除歧义。
如果这不是问题,唯一的另一种可能性是 baseItemId
上的 guid
约束在某种程度上不满足您为该参数传递的内容。
我正在 .net core 2.0 中实现面包屑导航,
要求是能够创建分层菜单,其中上一个面包屑项将带到父项等等...
该实现基于面包屑 ViewComponent 模型,该模型读取当前路线数据并将参数作为标记助手嵌入到面包屑链接中(asp-route-{value})
问题:
我有两个问题:
- 面包屑组件的 Razor 视图中的 ViewContext.RouteData.Values 不包含应该作为查询字符串参数传递的键 "id"
- 即使我出于测试目的对上面的代码进行硬编码,使用 asp-route-id 将其注入到 Razor 视图中的锚选项卡中 - 不会在末尾将其作为查询字符串参数注入动作,但在动作之后将其作为“{controller}/{action}/{id}”插入
这是来自浏览器的 URL:
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>
ViewContext.RouteData 中可用的数据 - 请注意,没有 id 作为路线数据的一部分传递 -
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
未进入路线而言,很可能还有另一条路线正在匹配,其中不包括此参数。路由短路,所以它总是会选择它可以匹配的最不具体的路由,然后只转储它不需要的任何其他内容作为查询字符串。您应该更改路由的顺序或改用自定义命名路由,以消除歧义。
如果这不是问题,唯一的另一种可能性是 baseItemId
上的 guid
约束在某种程度上不满足您为该参数传递的内容。