Ответ 1
Документация предполагает, что Server.UrlEncode
должен корректно обрабатывать амперсанды.
Я только что проверил ваш точный код, и возвращаемая строка была правильно закодирована:
Мне нужно перенаправить на URL-адрес, передавая параметр в виде строки запроса.
Это может включать значение Амперсанда в значении. таких как
string value = "This & That";
Response.Redirect("http://www.example.com/?Value=" + Server.UrlEncode(value));
Это возвращает http://www.example.com/?Value=This+&+That
Что я должен использовать для кодирования этой строки?
EDIT: Благодаря Люку за то, что он указывает на очевидное, код действительно работает правильно. Я извиняюсь, мой вопрос был недействительным вопросом в конце концов!
На странице у меня было много старого устаревшего кода, который, по-видимому, делает своеобразное кодирование и декодирование, и он выглядит так, как будто мой urlencode не работает.
Моим решением, к сожалению, является полностью отказаться от использования a и до тех пор, пока код, о котором идет речь, не может быть переписан. Вы не просто ненавидите старый код!
Документация предполагает, что Server.UrlEncode
должен корректно обрабатывать амперсанды.
Я только что проверил ваш точный код, и возвращаемая строка была правильно закодирована:
Технически:
value = value.Replace("&", "%26")
сделает трюк.
EDIT: Кажется, есть некоторые сложные проблемы со всеми методами UrlEncode/HttpEncode, которые не совсем делают трюк. Я написал простой способ, который может оказаться полезным. Это должно охватывать все основные проблемы с кодировкой, а также легко написать "дезактиватор".
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
Другим персонажем, которому нужно ускользнуть, является апостроф. Замените его% 27.
string url = Server.UrlEncode(value).Replace("'", "%27);
HttpUtility.UrlEncode() И Server.UrlEncode() не заменяют этот символ вместе с несколькими другими для обратной совместимости с другими .Net Framework. Подробнее см. В этой статье Microsoft: http://connect.microsoft.com/VisualStudio/feedback/details/214349/httputility-urlencode-does-not-encode-apostrophe
это правильно, однако, если в строке запроса есть несколько параметров.
например: & firstname = bob & secondName = "Tracy and John"
Вы должны использовать Server.UrlEncode(string containing the ampersand)
.
Я только что протестировал его, и строка возвращаемого запроса была правильно закодирована и затем расшифрована.
HttpUtility
не работал для этой операции.
И если вы получаете значение от GridView
, & ampersand
может отображаться как "&"
:
row.Cells[4].Text.ToString() = xxxx&
Итак, в этом случае вы захотите использовать:
.Replace("&", "%26")