代码之家  ›  专栏  ›  技术社区  ›  Ryan Eastabrook

MVC RouteLink被双重编码

  •  0
  • Ryan Eastabrook  · 技术社区  · 15 年前

    我在将基于web.config中定义的路由生成的页面中定义了以下链接

    <%= Html.RouteLink(product.DisplayName, "ShopProductNames", new {Id = product.Id, ProductName = product.DisplayName.Replace(' ', '-') }) %>
    

    我需要在链接的url中对displayname进行url编码,但是,当我按以下方式添加编码时:

    <%= Html.RouteLink(product.DisplayName, "ShopProductNames", new {Id = product.Id, ProductName = Url.Encode(product.DisplayName.Replace(' ', '-')) }) %>
    

    它对我的显示名进行双重编码(在url中),我在iis中得到一个错误。

    在将displayname属性传递到页之前,未对其进行编码。此外,默认情况下,RouteLink似乎不是呈现链接的URL编码,因为它在呈现页面时不会拾取空格或与号。

    有人知道我做错了什么吗?

    更新:我实际上指的是routelink生成的url,而不是链接文本本身

    更新2:这是我使用的路线

    routes.MapRoute(
                "ShopProductNames",
                "Shop/{productName}/p/{id}/{*nameInfo}",
                new
                {
                    controller = "Product",
                    action = "Detail"
                }
                );
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   eu-ge-ne    15 年前

    查看htmlhelper.cs文件,第140行:

    internal static string GenerateUrl(string routeName, string actionName, string controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, bool includeImplicitMvcValues)
    {
        RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, requestContext.RouteData.Values, routeValues, includeImplicitMvcValues);
    
        VirtualPathData vpd = routeCollection.GetVirtualPath(requestContext, routeName, mergedRouteValues);
        if (vpd == null) {
            return null;
        }
    
        string modifiedUrl = PathHelpers.GenerateClientUrl(requestContext.HttpContext, vpd.VirtualPath);
        return modifiedUrl;
    }
    

    URL由routeCollection.getVirtualPath()方法(system.web.routing.dll)创建。使用 Reflector 你会发现它使用 Uri.EscapeDataString() 内部(system.web.routing.parsedroute.bind方法)