【问题标题】:How does Stackoverflow escape tag names in urlsStackoverflow 如何在 url 中转义标签名称
【发布时间】:2009-03-07 12:47:01
【问题描述】:

我想从标签名称生成一个 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#”标签的 url 生成“c%23”而不是“c%2523”

我尝试了 Html.UrlEncode、Uri.EscapeDataString、Uri.EscapeUrlString,但都没有产生理想的“c%23”格式。

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

【问题讨论】:

    标签: .net url


    【解决方案1】:

    您似乎正在对 URL 进行两次编码,因为 c%2523 是 c%23 的编码值。 (0x23 = ASCII 35 = #,0x25 = ASCII 37 = %)。由于您有两个编码调用(Html.Encode 和 Html.UrlEncode),因此删除其中一个可能会解决您的问题。

    【讨论】:

    • 如果我根本不转义,它输出c# unscaped,hash变成url片段
    • 第一个Html.Encode是给链接文本的,所以跟锚的href部分没有关系
    • 是的,也注意到了这一点。我还没有使用过 ASP,所以我只能猜测。顺便说一句,您可以尝试使用类似 'new {tagName="c%23"}' 的方法进行测试吗?
    • 嗯...很好的测试。我手动把“c%23”放在那里,它仍然用“c%2523”转义。但是,如果我输入“c#”,它根本不会逃脱它。似乎那里的 Html.ActionLink 帮助器类中有某种“逻辑”。
    • 这里有一个类似的问题:stackoverflow.com/questions/406711/… - 但没有解决办法,所以没有多大帮助。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果我正确调用,那么 actionlink 会自动对 url 上的值进行编码,所以只需删除 Html.Encode(tagName),它应该看起来不错。

      【讨论】:

        【解决方案4】:
        <%= 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() 中的错误,您可能必须自己生成链接。

        【讨论】:

        • 我看到它 Html.AttributeEncode() 链接的所有属性,所以问题就在这里。 “c#”字符串不会被转义,因为它是一个有效的属性字符串,但如果我首先对“c#”进行 URL 编码,那么它将 AttributeEncode() 已经转义的字符串。在这种情况下,我必须完全跳过助手
        • AttributeEncode 是一个与 UrlEncode 完全不同的过程。首先,您对您希望用来获取有效 URL 的 URL 部分进行 UrlEncode。然后你 AttributeEncode-or-HtmlEncode 每个属性值,不管它是不是一个 URL。 AttributeEncode 只是关于'"
        • 很明显,ActionLink 助手正在那里做“某事”,把它搞砸了。我跳过了它并使用了“...”然后我完成了我的工作..
        猜你喜欢
        • 2011-02-07
        • 2018-01-06
        • 2013-09-09
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 2017-09-12
        • 2018-02-01
        • 2018-09-13
        相关资源
        最近更新 更多