如何防止Html.ActionLink在URL中编码非ASCII字符

时间:2012-09-05 02:43:03

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

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

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

虽然该网址将在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时完成。但是当通过包含中文字符的URL请求页面时观察Fiddler,似乎URL将被自动编码(可能通过Web浏览器)。为了便于阅读,我选择让Web浏览器进行编码工作。

1 个答案:

答案 0 :(得分:0)

对于<a>标记中生成的内容,浏览器之间没有区别;唯一的区别在于浏览器如何显示它。这里没有什么可以改变的; Html.ActionLink()正确编码/不编码。