Stackoverflow如何在URL中转义标记名称

时间:2009-03-07 12:47:02

标签: .net 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) 
%>

但如果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?

4 个答案:

答案 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()中的错误,您可能需要自己生成链接。