Как 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 ответа:
Похоже, что вы делаете два кодирования вашего 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 (), и вам, возможно, придется создать ссылку самостоятельно.