我正在开发.net core 2.0中的breadcrumb实现,
要求是能够创建一个分层菜单,其中前一个面包屑项将带到父母等等......
实现基于面包屑ViewComponent模型,该模型读取当前路径数据并将params作为标记帮助器(asp-route- {value})
作为痕迹链接的一部分嵌入问题:
我有两个问题:
这是来自浏览器的网址:
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中的Route模板
routes.MapRoute(
name: "areaRouteWithWholesaleCustomerCodeAndTargetId",
template: "{wholesaleCustomerCode}/{area:exists}/{baseItemId:guid}/{controller=Home}/{action=Index}/{id:guid?}"
);
Breadcrumb ViewComponent Razor View:
@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>
不知何故,它根本不尊重路线模板
我希望它按如下方式呈现:
硬件
预期行为:
我原以为它的工作原理如下:
对此有何建议或见解?
答案 0 :(得分:2)
它正在做你正在告诉它的事情。您将id
设置为查询字符串或仅orderId=test123
。结果,它将该字符串填入路由的id
部分(同时转义=
符号,因为它在URI的该部分中无效)。如果您希望orderId
作为查询字符串的一部分,那么您应该做的是将其作为路径参数传递:asp-route-orderId="@orderId"
。
就你的baseItemId
没有进入路线而言,很可能是另一条匹配的路线,不包括这个参数。路由短路,因此它总是选择它可以匹配的最不具体的路由,然后只丢弃它不需要的任何其他信息作为查询字符串。您应该更改路线的顺序或使用自定义命名路线,以消除歧义。
如果那不是问题,唯一的另一种可能性是guid
上的baseItemId
约束在某种程度上不能满足你为该参数传递的内容。