Razor 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视

我正在.net core 2.0中开发一个面包屑实现

要求是能够创建一个层次菜单,在那里前面的面包屑项目将采取的家长等

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

问题:

我有两个问题:

  • 面包屑组件Razor视图中的ViewContext.RouteData.Values不包含应该作为查询字符串参数传递的键“id”
  • 即使出于测试目的我硬编码了上面的代码,使用asp路由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>
    
    @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工作正常