2015-03-09 2 views
2

Я недавно создал вопрос о том, как использовать знаки, такие каки +, в URL-адресе, но это привело меня к другому вопросу, как мне заменить пробелы в моем URL-адресе и почему?URL-адрес заменяет пробелы + знаками

Если мой URL-адрес something.com/Find/this is my search, почему это неправильно? почему мы должны изменить его на something.com/Find/this+is+my+search

Я искал и пробовал решения уже более 5 часов. Везде, где я смотрю, ответ тот же, используйте httputility.urlencode или Uri.escapeDataString. Но я попытался сделать это так:

string encode = Uri.EscapeDataString(TextBoxSearch.Text); 
Response.Redirect("/Find/" + encode); 

string encode = HttpUtility.UrlEncode(TextBoxSearch.Text); 
Response.Redirect("/Find/" + encode); 

string encode = encode.replace(" ", "+") 
Response.Redirect("/Find/" + encode); 

Ни одна из этих работ, они не заменяют пространство с чем-либо (string.replace делает, но это также вызывает строку для изменения, что означает, что не может найти значения в базе данных на следующей странице).

Если я кодирую весь URL-адрес, то все мои / включаются в%, и это явно не то, что я хочу.

Что мне нужно

If I redirect like this Response.Redirect("/Find/" + search);. 
And I make a search like this "Social media". 
I then get the queryString on the next page and use it to load info from my database. 
Now I want to display info about Social media from my database. 
but at the same time I want the url to say Find/Social+media. 

EDIT:

Что попробовать:

string encode = HttpUtility.UrlEncode(TextBoxSearch.Text); 
Response.Redirect("/Find/" + encode); 

Это дает мне «404,11 - Модуль фильтрации запросов настроен на отклонить запрос который содержит двойную escape-последовательность ». на запрашиваемом URL http://localhost:65273/Find/social+media

в моем Find.aspx OnLoad():

IList<string> segments = Request.GetFriendlyUrlSegments(); 
string val = ""; 
for (int i = 0; i < segments.Count; i++) 
    { 
     val = segments[i]; 
    } 
search = val; 
+2

Это не является допустимым URL, пробелы в адресах являются '% 20' – Sayse

+0

Когда я бегу на локальный и сделать поиск с использованием пространства это работает отлично. даже без замены «+». Но после того, как я прочитал, я понимаю, что я не могу использовать пробелы в URL-адресе, так как я могу их заменить? – Rodal

+0

Ваш браузер превратит их в '% 20', поэтому не стоит беспокоиться. –

ответ

1

HttpUtility.UrlEncode заменяет места +, но, как отметил Патрик, лучше использовать %20. Итак, вы можете это сделать, используя String.Replace.

var encode = TextBoxSearch.Text.Replace(" ", "%20"); 

Кроме того, вы также должны кодировать значение для предотвращения любых видов атак XSS. Вы можете сделать оба эти метода с помощью первого кодирования, а затем заменить значение +.

var encode = HttpUtility.UrlEncode(TextBoxSearch.Text).Replace("+", "%20"); 
+0

Используя это, я получаю url 'http: // localhost: 65273/Find/social media', но если я скопирую и вставьте его сюда он говорит 'http: // localhost: 65273/Find/social% 20media'. Удаляет ли мой браузер '% 20'? – Rodal

+0

Некоторые браузеры пытаются очеловечить URL-адрес, так что это действительно возможно. –

+0

Кажется, FF делает это. Cus в Chrome я получаю% 20. Слишком плохо это касается только пробелов, а не знаков, таких как /, +,() и т. Д. Но мои вопросы заключались в том, как заменить пространство, чтобы это было принятым ответом – Rodal

3

Это прекрасно, чтобы заменить пространство с %20, так как это сбежавший форма пространства. %20 является безопасным URL, поэтому вы можете его использовать.

Фактически, %20 - это всего лишь шестнадцатеричное значение ASCII code для пробела. Использовать HttpUtility.UrlEncode достаточно.

Лучше использовать %20 вместо +, как объясняется в этом ответе: When to encode space to plus (+) or %20?.

+0

, но как это сделать? Я не могу получить что-либо, чтобы изменить свой запрос, независимо от того, что я попробую, пространство останется в URL-адресе. – Rodal

+0

Кодирование URL-адреса достаточно. Строка, возвращаемая в .NET, хороша. –

+0

Это потому, что Im работает localhost? Так что в принципе мне не нужно ничего кодировать? 'Response.redirect ("/Find/"+ search)' будет работать? – Rodal

Смежные вопросы