ASP.Net URLEncode Ampersand для использования в строке запроса - PullRequest
19 голосов
/ 18 февраля 2009

Мне нужно перенаправить на URL, передав параметр в виде строки запроса.

Это может включать в себя амперсанд в значении. такие как

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

Это, однако, возвращает http://www.example.com/?Value=This+&+That

Что я должен использовать для кодирования этой строки?

EDIT: Спасибо Люку за указание на очевидное, код действительно работает правильно. Я прошу прощения, мой вопрос не был действительным в конце концов!

На странице, на которой я собирался, было много старого унаследованного кода, который, по-видимому, выполняет некую кодировку и декодирование, создавая впечатление, будто мой urlencode не работает.

Мое решение, к сожалению, состоит в том, чтобы полностью отказаться от использования &, пока рассматриваемый код не будет переписан. Разве ты просто не ненавидишь старый код!

Ответы [ 7 ]

24 голосов
/ 18 февраля 2009

Документация предполагает, что Server.UrlEncode должен правильно обрабатывать амперсанды.

Я только что проверил ваш точный код, и возвращенная строка была правильно закодирована:

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

15 голосов
/ 18 февраля 2009

Технически занимаюсь:

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

сделает свое дело.

РЕДАКТИРОВАТЬ: Кажется, есть некоторые хитрые проблемы с целыми методами 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
2 голосов
/ 20 июня 2012

Вы должны использовать Server.UrlEncode(string containing the ampersand).

Я только что проверил это, и возвращенная строка запроса была правильно закодирована и затем декодирована.

HttpUtility не работал для этой операции.

2 голосов
/ 25 марта 2011

это правильно, однако, если у вас есть несколько параметров в строке запроса.

например: & firstname = bob & secondName = "Трейси и Джон"

2 голосов
/ 22 сентября 2010

Другой персонаж, которому нужно убежать, - это апостроф. Замените его на% 27.

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

HttpUtility.UrlEncode () и Server.UrlEncode () не заменяют этот символ вместе с несколькими другими для обратной совместимости с другими .Net Frameworks. См. Эту статью Microsoft для деталей: http://connect.microsoft.com/VisualStudio/feedback/details/214349/httputility-urlencode-does-not-encode-apostrophe

1 голос
/ 16 марта 2012

И если вы получаете значение от GridView, & ampersand вполне может отображаться как "&amp;":

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

Так что в этом случае вы захотите использовать:

.Replace("&amp;", "%26")
0 голосов
/ 29 ноября 2018

В .net core ver 2.1 (конец 2018 г.) я смог использовать следующее:

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