【发布时间】: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”片段中。由于该片段仅用于提高可读性,因此我将此类字符替换为破折号。
这样的替换字符包括
- URI 中的保留字符列表。见https://www.rfc-editor.org/rfc/rfc3986#section-2.2
- 单引号和双引号
- 制表符
不过,非 ASCII 字符在某些时候应该进行百分比编码,因为它们在 URI 中无效,最好在生成 URL 时完成。但是通过观察 Fiddler 在通过包含中文字符的 URL 请求页面时,似乎该 URL 将被自动编码(可能通过网络浏览器)。为了可读性,我选择让网络浏览器完成编码工作。
【问题讨论】:
-
不要被地址栏中显示的内容所迷惑;这并不能可靠地表明 URL 中的内容是否合法。
-
@Andrew 如果我在地址栏中输入的内容可以将我带到我想要的页面,那就足够了。即使它们是非法的,我也会在意
标签: asp.net-mvc-3 routes url-encoding