MVC RouteLink是双重编码的

时间:2009-07-15 17:16:16

标签: asp.net-mvc

我在页面中定义了以下链接,该页面将根据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(' ', '-')) }) %>

它重新编码我的DisplayName(在URL中),我在IIS中收到错误。

我的DisplayName属性在传递给页面之前未进行编码。此外,默认情况下,RouteLink似乎不是渲染链接的Url编码,因为在渲染页面时它不会拾取空格或“&”符号。

任何人都知道我做错了什么?

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

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

routes.MapRoute(
            "ShopProductNames",
            "Shop/{productName}/p/{id}/{*nameInfo}",
            new
            {
                controller = "Product",
                action = "Detail"
            }
            );

1 个答案:

答案 0 :(得分:1)

查看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方法)