asp-route- {value}标记帮助程序不尊重路径模板

时间:2017-10-23 06:37:02

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

我正在开发.net core 2.0中的breadcrumb实现,

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

实现基于面包屑ViewComponent模型,该模型读取当前路径数据并将params作为标记帮助器(asp-route- {value})

作为痕迹链接的一部分嵌入

问题:

我有两个问题:

  1. 面包屑组件的Razor视图中的ViewContext.RouteData.Values不包含密钥" id"应该作为查询字符串参数传递的那些
  2. 即使我硬编码上面的测试用途,使用asp-route-id将其注入Razor视图中的anchor选项卡 - 在操作结束时不会将其作为查询字符串参数注入,但是它为" {controller} / {action} / {id}"行动之后
  3. 这是来自浏览器的网址:

    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作为路径数据的一部分传递 -

    enter image description here

    ViewContext.HttpContext.Request.QueryString值:

    enter image description here

    使用asp-route- {value}标记帮助器我将2个id注入到锚标记中,baseItemId是路由映射和id的一部分 - 这也是路由映射的一部分但作为查询字符串

    当呈现菜单时,这是我在面包屑中得到的:

    <a class="" href="/XXX/Service/Hardware/Detail/orderid%3DtestId-123?baseItemId=09185d87-5e3f">
                Hardware
                </a>
    

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

    我希望它按如下方式呈现:

                硬件             

    预期行为:

    我原以为它的工作原理如下:

    1. 我应该能够获得价值&#34; id&#34;来自路由值,而不是依赖于查询字符串参数
    2. 根据文档注入2个id,它们应该出现在路由模板中定义的各自位置,baseItemId首先作为路由的一部分 - 然后id作为最后一个动作的查询字符串部分
    3. 对此有何建议或见解?

1 个答案:

答案 0 :(得分:2)

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

就你的baseItemId没有进入路线而言,很可能是另一条匹配的路线,不包括这个参数。路由短路,因此它总是选择它可以匹配的最不具体的路由,然后只丢弃它不需要的任何其他信息作为查询字符串。您应该更改路线的顺序或使用自定义命名路线,以消除歧义。

如果那不是问题,唯一的另一种可能性是guid上的baseItemId约束在某种程度上不能满足你为该参数传递的内容。