2009-07-15 4 views
0

I持ってMVC RouteLinkは、二重符号化されている

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

が、私はそれのURLで表示名をURLエンコードする必要がweb.configファイルで定義された経路に基づいて構築されるページで定義され、以下のリンク私は次のようにエンコーディングを追加するときに、リンクは、しかし、:

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

それは、二重(URLで)私のDisplayNameをコードし、そして私は、IISでエラーが発生します。

My DisplayNameプロパティは、ページに渡される前にエンコードされていません。また、RouteLinkは、ページがレンダリングされるときに空白またはアンパサンドを拾わないため、レンダリングされたリンクのURLエンコーディングがデフォルトでは表示されません。

誰かが間違っていることを知っていますか?

UPDATE:私は実際にRouteLinkによって生成されたURLを参照しています、いないリンクテキスト自体

UPDATE 2:ここで私はHtmlHelper.csで

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

Url.Encode()を使用せずにProductName = product.DisplayName.Replace( ''、 ' - ') 。ルート値はRouteLink()でエンコードされます。たとえば、 ""%20 "にエンコードされます。 –

+0

うん、私はそれを試みましたが、それはまだエンコードしません。 –

+0

また、私はMVCソースを見ています、私はすべてのRouteLinkコールを追跡しました。私が知る限り、URLエンコーディングコールはありません。 –

答えて

1

ルックを使用しているルートでありますファイル、行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メソッド)を使用することがわかります

+0

もしそうなら、何かが正しくない、私がUrl.Encode(ProductName)を離れるときにスペースとアンパサンドを使用してエンコードしなければならないが、それは確かに起こっていない。 –

関連する問題