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

时间:2013-12-21 16:04:04

标签: c# asp.net-mvc url-encoding mailto

我在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 Validator上验证。我收到错误:

  

错误值mailto:?subject =主题&amp; body =这是url:%0D%0Ahttp:// localhost:8580 / home表示元素a上的属性href:查询组件中的空格。使用%20代替空格。

我尝试使用HttpUtility.UrlEncode进行编码,但是当我打开电子邮件时,我会在主题和正文中获得“+”符号和其他内容,但我无法解决此问题。

3 个答案:

答案 0 :(得分:15)

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

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

HttpUtility.UrlEncodeHttpUtility.UrlEncodeUnicode无法正确编码空格 - 它们会成为加号(&#34; +&#34;),然后在主题行/正文中显示为加号等等HttpUtility.UrlPathEncode似乎解决了这个问题,但没有正确编码其他字符,例如?,#和/。 Uri.EscapedDataString似乎是正确编码所有这些字符的唯一方法。我想Uri.HexEscape同样可以正常工作,但看起来可能有点矫枉过正。

警告:即使是各种各样的浏览器和电子邮件客户端,我也没有对此进行测试

答案 1 :(得分:5)

您需要使用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个部分,并且不能将HttpUtility.UrlPathEncode放在整个String.Format周围,因为HttpUtility.UrlPathEncode特别处理?并且只对?之前的文本进行编码。

来自MSDN

  

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

答案 2 :(得分:0)

那是因为剃刀不知道何时开始处理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>

修改

答案

我被剃刀中的sytanx错误带走了。但是,即使您编辑了问题,我仍然可以看到一些问题。第一个问题是你打开两个括号但只关闭一个。第二个问题是你指定一个空的电子邮件地址,你应该至少添加一个空格(不是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