2009-02-18 7 views
18

Potrzebuję przekierować do adresu URL przekazującego parametr jako ciąg zapytania.Ampersand URLEncode ASP.Net do użycia w łańcuchu zapytań

Może to być Ampersand w wartości. takich jak

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

to jednak zwraca http://www.example.com/?Value=This+&+That

Co należy używać do kodowania ten ciąg?

EDYCJA: Dzięki Luke za wskazanie oczywiste, kod rzeczywiście działa poprawnie. Przepraszam, moje pytanie nie było jednak poprawnym pytaniem!

Strona, którą miałem zamiar mieć dużo starego kodu, który najwyraźniej robi coś w rodzaju kodowania i dekodowania, sprawiając wrażenie, że mój kod urlenowy nie działa.

Moje rozwiązanie polega niestety na całkowitym zaprzestaniu korzystania z &, dopóki dany kod nie zostanie ponownie napisany. Nie po prostu nienawidzisz starego kodu!

Odpowiedz

24

documentation sugeruje, że Server.UrlEncode powinien obsługiwać ampersandy poprawnie.

Właśnie przetestowaniu dokładnie kod i zwrócony ciąg został poprawnie zakodowany:

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

+0

Masz całkowitą rację! Strona, z której korzystałem, miała dużo starego kodu, który w pewnym sensie wykonuje jakieś kodowanie i dekodowanie, sprawiając wrażenie, że mój kod URL nie działa. Działa to poprawnie .. tak jak powinno !! –

+2

W sytuacjach, gdy nie masz zmiennej Server, możesz również uzyskać dostęp do metod urlencode/urldecode przez System.Web.HttpUtility –

+1

Uwaga dla innych osób odwiedzających tę stronę; jeśli nie znajdujesz się w aplikacji ASP (a więc nie masz dostępu do 'Server'), możesz użyć' System.Web.HttpUtility.UrlEncode'. –

13

Technicznie robi:

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

rade.

EDYCJA: Wygląda na to, że niektóre metody UrlEncode/HttpEncode nie są łatwe do rozwiązania. Napisałem prostą metodę, która może okazać się przydatna. Powinno to obejmować wszystkie główne problemy z kodowaniem, a także łatwe do napisania "desanitizer".

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 
+1

Miałem nadzieję na coś więcej ... wbudowane ... –

+0

Uzgodnione. "&" jest zarezerwowaną postacią w adresie URL, a więc nie będzie kodowane za pomocą adresu URL. –

+0

Z technicznego punktu widzenia wystarczy "Odkaż" przednie ukośniki, znaki ampersand i znaki zapytania. URLEncode zrobi resztę. –

2

jest to poprawne, jeśli masz kilka parametrów w ciągu zapytania.

na przykład: & firstname = bob & secondName = "Tracy i John"

1

A jeśli otrzymujesz wartość z GridView& ampersand może równie dobrze być wyświetlane jako "&amp;":

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

Tak więc w tym przypadku będziesz chciał użyć:

.Replace("&amp;", "%26") 
2

Musisz użyć Server.UrlEncode(string containing the ampersand).

Właśnie przetestowałem i zwracany ciąg zapytania został poprawnie zakodowany, a następnie zdekodowany.

HttpUtility nie działa w tej operacji.