我想从标签名称生成一个网址。
在我看来(asp.net mvc)我有以下内容:
<%= Html.ActionLink(Html.Encode(tagName),
"tagged" //action,
"posts" //controller,
new {tagName=Html.UrlEncode(tagName)} //querystring argument,
new {@class="tag"} //html attributes)
%>
但如果tagName为“c#”(不带引号),则会生成以下URL:
http://localhost/posts/tagged/c%2523
导致Http 400错误 - 错误请求
在Stackoverflow上,相同“c#”标记的网址生成“c%23”而不是“c%2523”
我尝试了Html.UrlEncode,Uri.EscapeDataString,Uri.EscapeUrlString,但这些都没有产生理想的“c%23”格式。
那么我应该如何编码锚的tagName?
答案 0 :(得分:4)
您似乎正在对URL进行两次编码,因为c%2523是c%23的编码值。 (0x23 = ASCII 35 =#,0x25 = ASCII 37 =%)。由于你有两个编码调用(Html.Encode和Html.UrlEncode),也许删除其中一个会消除你的问题。
答案 1 :(得分:0)
#对应于十六进制中的ascii值23。所以我猜他们使用十六进制值。
答案 2 :(得分:0)
如果我没记错的话,那么actionlink会自动对网址上的值进行编码,所以只需删除Html.Encode(tagName),它看起来应该很好。
答案 3 :(得分:0)
<%= 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.Encode链接文本,或Html.UrlEncode参数。
如果参数值中的'#'未被转义,这听起来像是ActionLink()中的错误,您可能需要自己生成链接。