2009-07-15 7 views
0

je le lien suivant défini dans une page qui sera construit en fonction de l'itinéraire défini dans le web.configMVC RouteLink étant à double codé

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

J'ai besoin d'URL encode le DisplayName dans l'URL de cette lien, cependant, quand j'ajoute le codage de la manière suivante:

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

Il double de code ma DisplayName (dans l'URL), et je reçois une erreur dans IIS.

Ma propriété DisplayName n'est pas codée avant d'être transmise à la page. En outre, RouteLink ne semble pas être le codage Url pour le lien rendu par défaut car il ne prend pas les espaces ou les esperluettes lorsque la page est rendue.

Quelqu'un sait ce que je fais mal?

MISE À JOUR: Je parle en fait à l'URL générée par RouteLink, et non le texte du lien lui-même

MISE À JOUR 2: voici la route que je utilise

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

Avez-vous essayé ProductName = product.DisplayName.Replace ('', '-') sans Url.Encode() . Les valeurs de routage sont codées dans RouteLink(), par exemple "" est codé sur "% 20" –

+0

Oui, j'ai essayé, et il ne code toujours pas. –

+0

En outre, je regarde la source MVC, j'ai suivi tous les appels RouteLink, et de ce que je peux dire, il n'y a pas d'appels d'encodage Url. –

Répondre

1

Regardez HtmlHelper.cs fichier, ligne 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 est créé par la méthode routeCollection.GetVirtualPath() (System.Web.Routing.dll). En utilisant Reflector, vous verrez qu'il utilise Uri.EscapeDataString() en interne (méthode System.Web.Routing.ParsedRoute.Bind)

+0

Ok, si c'est le cas, alors quelque chose ne va pas, quand je laisse le Url.Encode (ProductName) il devrait prendre des espaces et des esperluettes et les encoder, mais ce n'est certainement pas le cas. –