Как Stackoverflow экранирует имена тегов в URL-адресах


Я хочу создать url-адрес из имени тега.

На мой взгляд (asp.net mvc) у меня есть следующее:

<%= Html.ActionLink(Html.Encode(tagName), 
"tagged" //action, 
"posts" //controller, 
new {tagName=Html.UrlEncode(tagName)} //querystring argument, 
new {@class="tag"} //html attributes) 
%>

Но это генерирует следующий URL, если tagName является " c# "(без кавычек):

http://localhost/posts/tagged/c%2523

Что приводит к Http 400 error-Bad Request

В Stackoverflow url-адрес для того же тега "c#" генерирует "c%23 "вместо" c%2523 "

Я попробовал Html.UrlEncode, Uri.Сбежал Из Тюрьмы, Ури.EscapeUrlString, но ни один из них не производит желаемого "c%23" формат.

Итак, как я должен кодировать tagName для якоря?

4 2

4 ответа:

Похоже, что вы делаете два кодирования вашего URL, так как c%2523-это кодированное значение для c%23. (0x23 = ASCII 35 = #, 0x25 = ASCII 37 = %). Поскольку у вас есть два вызова кодирования (Html.Кодирование и Html.UrlEncode), возможно, удаление одного из них устраняет вашу проблему.

# соответствует значению ascii 23 в шестнадцатеричном формате. Поэтому я думаю, что они используют шестнадцатеричное значение.

Если я перепишу правильно, то actionlink автоматически закодирует значения на url, поэтому просто удалите Html.Кодируйте (tagName), и это должно выглядеть красиво.

<%= Html.ActionLink(Html.Encode(tagName), 
"tagged" //action,  
"posts" //controller, 
new {tagName=Html.UrlEncode(tagName)} //querystring argument, 
new {@class="tag"} //html attributes) 
%>

Html.ActionLink создает HTML и решает для вас проблемы с экранированием. Вы не должны явно Html.Кодировать текстовую ссылку или HTML.UrlEncode параметр.

Если ‘#’ в значении параметра не экранируется, это звучит как ошибка в ActionLink (), и вам, возможно, придется создать ссылку самостоятельно.