【问题标题】:How to prevent Html.ActionLink to encode non-ASCII character in URL如何防止 Html.ActionLink 在 URL 中编码非 ASCII 字符
【发布时间】:2012-08-29 17:22:16
【问题描述】:

在我下面的代码中,当 postSummary.SEOFriendlyTitleInURL 包含中文字符时,这些字符将被编码在 url 中。

@Html.ActionLink(
    postSummary.Title,
    "View",
    new
    {
        id = postSummary.Id,
        friendlyTitle = postSummary.SEOFriendlyTitleInURL
    })

虽然该 url 在 Google Chrome 和 Firefox 中会显示为原始字符,但在 IE 中它是一个编码字符串。我想阻止 ActionLink 方法的默认编码行为,因为我可以直接在地址栏中输入那些未编码的字符。所以我认为它们在 URL 中是合法的。

我可以简单地手动构建链接,但为了一致性,最好是生成:

<a href="/post/@postSummary.SEOFriendlyTitleInURL/@postSummary.Id">@postSummary.Title</a>

编辑:

我目前的解决方案:通过使用 Html.ActionLink 和 Server.UrlDecode 方法,我告诉它不要编码任何字符,而不是阻止框架只编码非 ASCII 字符。如果某些字符确实需要进行百分比编码,它们只能出现在“friendlyTitle”片段中。由于该片段仅用于提高可读性,因此我将此类字符替换为破折号。

这样的替换字符包括

不过,非 ASCII 字符在某些时候应该进行百分比编码,因为它们在 URI 中无效,最好在生成 URL 时完成。但是通过观察 Fiddler 在通过包含中文字符的 URL 请求页面时,似乎该 URL 将被自动编码(可能通过网络浏览器)。为了可读性,我选择让网络浏览器完成编码工作。

【问题讨论】:

  • 不要被地址栏中显示的内容所迷惑;这并不能可靠地表明 URL 中的内容是否合法。
  • @Andrew 如果我在地址栏中输入的内容可以将我带到我想要的页面,那就足够了。即使它们是非法的,我也会在意

标签: asp.net-mvc-3 routes url-encoding


【解决方案1】:

&lt;a&gt;标签中生成的内容而言,浏览器之间没有区别;唯一的区别在于浏览器的显示方式。这里没有什么可以改变的; Html.ActionLink() 正确编码/未编码。

【讨论】:

  • 是的,生成的url合法且有效,但阅读起来不方便。我在 url 中包含该标题只是为了便于阅读,否则 id 值就足够了。我希望看到该网址的人知道当我在其他网站上共享地址时该页面在谈论什么。我考虑的另一件事是搜索引擎可能会关心 url 中的内容,但我不确定。
  • 当我说它不容易被阅读时,这意味着每个字符都会产生 3 个字节,如“%E8%80%83”,想象一个带有标题的帖子的地址可能有多长只有几个字符
猜你喜欢
  • 1970-01-01
  • 2013-11-27
  • 2012-09-16
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
相关资源
最近更新 更多