【问题标题】:asp-route-{value} tag helper not respecting route templateasp-route-{value} 标签助手不尊重路由模板
【发布时间】:2018-04-03 15:25:41
【问题描述】:

我正在 .net core 2.0 中实现面包屑导航,

要求是能够创建一个分层菜单,其中以前的面包屑项将带到父级等等......

该实现基于面包屑 ViewComponent 模型,该模型读取当前路由数据并将参数作为面包屑链接的一部分嵌入为标签助手(asp-route-{value})

问题:

我有两个问题:

  1. Razor 视图中面包屑导航组件的 ViewContext.RouteData.Values 不包含应该作为查询字符串参数传递的键“id”
  2. 即使我出于测试目的对上述内容进行硬编码,使用 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>

不知何故,它根本不尊重路由模板

我希望它呈现如下:

硬件

预期行为:

我原以为它会按如下方式工作:

  1. 我应该能够从路由值中获取值“id”,而不是依赖于查询字符串参数
  2. 根据文档注入 2 个 id,它们应该出现在路由模板中定义的各自位置,baseItemId 首先作为路由的一部分 - 然后 id 作为最后一个操作的查询字符串部分

对此有何建议或见解?

【问题讨论】:

    标签: razor asp.net-core-mvc .net-core asp.net-core-mvc-2.0


    【解决方案1】:

    它正在做你告诉它做的事情。您正在将id 设置为查询字符串或只是orderId=test123。结果,它将该字符串塞进了路由的id 部分(同时转义了= 符号,因为它在URI 的那部分中是无效的)。如果您希望 orderId 作为查询字符串的一部分,您应该做的是将其作为路由参数传递:asp-route-orderId="@orderId"

    就您的baseItemId 未进入该路线而言,很可能有另一条路线正在匹配,其中不包含此参数。路由短路,所以它总是会选择它可以匹配的最不具体的路由,然后将它不需要的任何其他内容作为查询字符串转储。您应该更改路线的顺序或改用自定义命名路线,以消除歧义。

    如果这不是问题,唯一的另一种可能性是 baseItemId 上的 guid 约束不知何故不满足您为该参数传递的内容。

    【讨论】:

    • 谢谢 - 这对它有帮助 - 我昨天确实尝试过 asp-route-orderId,但我想我可能错过了一些东西,因为我认为它给出了相同的 URL 结果 - 是的,无论出于何种原因匹配不正确的路由 - 更改为 asp-route-orderId 工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2016-06-04
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    相关资源
    最近更新 更多