如何在ASP.NET MVC中正确编码MailTo链接?

14

我在一个ASP.NET MVC 5应用程序中有以下的mailto链接:

<a rel="nofollow" href="@(
  String.Format("mailto:?subject={0}&amp;body={1}", 
    "The title", "The description" + "%0D%0A" + "http://theurl.xyz")">
  share by email
</a>

这段代码无法通过HTML验证器。我遇到了以下错误:

元素a的属性href中提供的值mailto:?subject=The subject&body=This is the url:%0D%0Ahttp://localhost:8580/home不合法:查询组件中包含空格,请使用%20代替空格。

我尝试使用HttpUtility.UrlEncode进行编码,但是在打开邮件时,主题和正文中会出现"+"号和其他字符,而我无法解决该问题。


你试过我建议的HttpUtility.UrlPathEncode了吗? - nemesv
2
Uri.EscapeDataString 解决了问题。 - Hamid Shahid
3个回答

25

我知道这有点旧,但当我尝试找出编码mailto链接的最佳方法时,我发现最好的方法是对每个参数使用Uri.EscapeDataString,然后使用HttpUtility.HtmlAttributeEncode来编码整个属性:

HttpUtility.HtmlAttributeEncode(
    String.Format("mailto:?subject={0}&body={1}", 
        Uri.EscapeDataString(subject), 
        Uri.EscapeDataString(body)))

HttpUtility.UrlEncodeHttpUtility.UrlEncodeUnicode不能正确编码空格--它们会变成加号("+"),然后在主题行/正文等中显示为加号。 HttpUtility.UrlPathEncode似乎解决了这个问题,但无法正确编码其他字符,如?、#和/。 Uri.EscapedDataString似乎是唯一一个能正确编码所有这些字符的方法。我想Uri.HexEscape也同样有效,但似乎有些过头。

注意:我尚未针对广泛的浏览器和电子邮件客户端进行测试。


请查看@lukas-kabrt的这个SO答案<a class="btn btn-primary center" href="mailto:@Model.emailto?Subject=@Model.emailSubject&body=@Url.Encode(Model.body)">发送邮件</a> - user3590235

9
你需要使用 HttpUtility.UrlPathEncode 而不是 HttpUtility.UrlEncode
<a rel="nofollow" href="@(
  (String.Format("mailto:?subject={0}&body={1}", 
    HttpUtility.UrlPathEncode("The subject line"), 
    HttpUtility.UrlPathEncode("The body") + "%0D%0A" + "http://theurl.xyz"))))">
  share by email
</a>

注意: 您需要分别对各部分使用 HttpUtility.UrlPathEncode 进行编码,不能将整个 String.Format 放入 HttpUtility.UrlPathEncode 中,因为 HttpUtility.UrlPathEncode 会特别处理 ?,只对 ? 前面的文本进行编码。

MSDN 网站获取:

您可以使用 UrlEncode 方法或 UrlPathEncode 方法对 URL 进行编码。但是,这两种方法返回不同的结果。UrlEncode 方法将每个空格字符转换为加号字符(+)。而 UrlPathEncode 方法将每个空格字符转换为十六进制表示中的字符串“%20”,代表一个空格。


1
我不确定OP的情况,但对我来说这是正确的,但只到一定程度。我需要处理空格和&符号。UrlPathEncode将正确处理空格,但会错误地处理&符号。仍然+1,因为它指引了我正确的方向。 - Frank V
请查看此SO答案 - user3590235

0

这是因为 Razor 不知道何时开始处理 C# 代码。您必须明确告诉 Razor 何时解释 C# 代码...

<a rel="nofollow" href=" @(string.Format("mailto:?subject={0}&body={1}", ViewBag.Title, ViewBag.Description + "%0D%0A" + ViewBag.Url))>Share by Email </a>

编辑

答案

我被你在 Razor 中的语法错误所困扰。然而,即使在你编辑了问题之后,我仍然能看到一些问题。第一个问题是你打开了两个括号但只关闭了一个。第二个问题是你指定了一个空的电子邮件地址,至少应该添加一个空格(不是 HTML 编码)。最后一个问题是你实际上没有分离主题和正文,因为你使用了 ? 而不是 &。如果你纠正这些问题,你就可以顺利进行了。以下是基于你的问题的示例...

<a rel="nofollow" href="@(String.Format("mailto: ?subject={0}&body={1}"
                                            , "The title"
                                            , "The description" + "%0D%0A" + "http://theurl.xyz"))">
    share by email
</a>

这应该可以工作。但是如果您想做更多花哨的东西,请阅读this RFC


抱歉,伙计,我误读了你的问题,并且注意到你的Razor代码中存在语法错误。我会编辑我的答案。 - Leo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接