2009-03-07 33 views
2

我想从标记名称生成URL。 Stackoverflow如何在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) 
%> 

                  
                

但如果标记名是 “c#”(不带引号),这会产生以下网址:

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

                  
                

导致HTTP 400错误 - 错误的请求

在计算器上,对于相同的 “C#” 标签中的URL生成 “C%23”,而不是 “C%2523”

我试过Html.UrlEncode,Uri.EscapeDataString,Uri.EscapeUrlString,但没有一个产生所需的“c%23”格式。

那么我应该如何编码锚的tagName?

回答

3

看起来好像你正在做你的URL的两个编码,因为c%2523是c%23的编码值。 (0x23 = ASCII 35 =#,0x25 = ASCII 37 =%)。由于您有两个编码调用(Html.Encode和Html.UrlEncode),所以删除其中一个可以消除您的问题。

+0

如果我完全不转义它,它会输出c#未转义,并且哈希变成url片段 – gCoder 2009-03-07 12:53:43

+0

第一个Html.Encode用于链接文本,因此它与锚的href部分无关 – gCoder 2009-03-07 12:57:03

0

#对应十六进制的ASCII值ascii值23。所以我猜他们使用十六进制值。

0

如果我正确回复,那么actionlink会自动编码url上的值,所以只需删除Html.Encode(tagName),它应该很好看。

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()中的错误,并且您可能必须自己生成链接。