web-dev-qa-db-fra.com

ASP.Net URLEncode Esperluette à utiliser dans la chaîne de requête

J'ai besoin de rediriger vers une URL en passant un paramètre sous forme de chaîne de requête.

Cela peut inclure une esperluette dans la valeur. tel que

string value = "This & That";
Response.Redirect("http://www.example.com/?Value=" + Server.UrlEncode(value));

Ceci retourne cependant http://www.example.com/?Value=This+&+That

Que devrais-je utiliser pour encoder cette chaîne?

EDIT: Merci Luke d’avoir signalé l’évident, le code fonctionne effectivement correctement. Je m'excuse, ma question n'était pas une question valide après tout!

La page que j'allais contenait beaucoup d'anciens codes hérités, qui semblent apparemment se coder et se décoder eux-mêmes pour donner l'impression que mon code urlencode ne fonctionnait pas.

Ma solution est malheureusement d'abandonner complètement l'utilisation d'un & jusqu'à ce que le code en question puisse être réécrit. Ne détestez-vous pas le vieux code!

19
Robin Day

La documentation suggère que Server.UrlEncode devrait gérer correctement les esperluettes.

Je viens de tester votre code exact et la chaîne renvoyée était correctement codée:

http://www.example.com/?Value=This+%26+That

24
LukeH

Faire techniquement: 

value = value.Replace("&", "%26") 

fera l'affaire.

EDIT: Il semble y avoir des problèmes délicats avec les méthodes entières UrlEncode/HttpEncode qui ne font pas tout à fait l'affaire. J'ai écrit une méthode simple il y a quelque temps qui peut être utile. Cela devrait couvrir tous les principaux problèmes d’encodage, et il est également facile d’écrire un "désanitiseur".

Protected Function SanitizeURLString(ByVal RawURLParameter As String) As String

      Dim Results As String

      Results = RawURLParameter    

      Results = Results.Replace("%", "%25")
      Results = Results.Replace("<", "%3C")
      Results = Results.Replace(">", "%3E")
      Results = Results.Replace("#", "%23")
      Results = Results.Replace("{", "%7B")
      Results = Results.Replace("}", "%7D")
      Results = Results.Replace("|", "%7C")
      Results = Results.Replace("\", "%5C")
      Results = Results.Replace("^", "%5E")
      Results = Results.Replace("~", "%7E")
      Results = Results.Replace("[", "%5B")
      Results = Results.Replace("]", "%5D")
      Results = Results.Replace("`", "%60")
      Results = Results.Replace(";", "%3B")
      Results = Results.Replace("/", "%2F")
      Results = Results.Replace("?", "%3F")
      Results = Results.Replace(":", "%3A")
      Results = Results.Replace("@", "%40")
      Results = Results.Replace("=", "%3D")
      Results = Results.Replace("&", "%26")
      Results = Results.Replace("$", "%24")

      Return Results

End Function
15
Dillie-O

Vous devez utiliser Server.UrlEncode(string containing the ampersand).

Je viens de le tester et la chaîne de requête renvoyée a été correctement codée puis décodée.

HttpUtility n'a pas fonctionné pour cette opération.

2
Omgee Cares

ceci est correct cependant si vous avez plusieurs paramètres dans la chaîne de requête.

par exemple: & firstname = bob & secondName = "Tracy et John"

2
tigerdev

L'apostrophe est un autre personnage à échapper. Remplacez-le par% 27.

string url = Server.UrlEncode(value).Replace("'", "%27);

HttpUtility.UrlEncode () et Server.UrlEncode () ne remplacent pas ce caractère avec quelques autres pour des raisons de compatibilité avec les autres Frameworks .Net. Voir cet article de Microsoft pour plus de détails: http://connect.Microsoft.com/VisualStudio/feedback/details/214349/httputility-urlencode-does-not-encode-apostrophe

2
goku_da_master

Et si vous obtenez une valeur de GridView, le & ampersand peut très bien s'afficher sous la forme "&amp;":

row.Cells[4].Text.ToString() = xxxx&amp;

Donc, dans ce cas, vous voudrez utiliser:

.Replace("&amp;", "%26")
1
Kinch

Dans .net core version 2.1 (fin 2018), j'ai pu utiliser les éléments suivants: 

System.Web.HttpUtility.UrlEncode(string_to_encode)
0
Eli