【发布时间】:2018-04-03 15:25:41
【问题描述】:
我正在 .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?}"
);
面包屑视图组件剃刀视图:
@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 作为最后一个操作的查询字符串部分
对此有何建议或见解?
【问题讨论】:
标签: razor asp.net-core-mvc .net-core asp.net-core-mvc-2.0