MVC RouteLink в двойном кодировании - PullRequest
0 голосов
/ 15 июля 2009

У меня есть следующая ссылка, определенная на странице, которая будет построена на основе маршрута, определенного в 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 для отображаемой ссылки по умолчанию, поскольку он не выбирает пробелы или амперсанды при отображении страницы.

Кто-нибудь знает, что я делаю не так?

ОБНОВЛЕНИЕ: Я на самом деле имею в виду URL, сгенерированный RouteLink, а не сам текст ссылки

ОБНОВЛЕНИЕ 2: вот маршрут, которым я пользуюсь

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

1 Ответ

1 голос
/ 15 июля 2009

Посмотрите на файл 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...