【问题标题】:How to correctly encode MailTo links in ASP.NET MVC?如何正确编码 ASP.NET MVC 中的 MailTo 链接?
【发布时间】:2014-01-10 07:59:28
【问题描述】:

我在 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=主题&body=这是元素 a 上属性 href 的 url:%0D%0Ahttp://localhost:8580/home:查询组件中的空白。使用 %20 代替空格。

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

【问题讨论】:

  • 您是否按照我的建议尝试了HttpUtility.UrlPathEncode
  • Uri.EscapeDataString 成功了

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


【解决方案1】:

那是因为 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>

编辑

回答

我被你剃须刀中的 sytanx 错误迷住了。但是,即使您编辑了问题,我仍然可以在那里看到一些问题。第一个问题是您打开两个括号但只关闭一个。第二个问题是您指定了一个空的电子邮件地址,好吧,您至少应该添加一个空格(不是 html 编码的)。最后一个问题是您实际上并没有将主题和正文分开,因为您使用的是? 而不是&amp;。如果你纠正了这些问题,你应该很高兴。这是基于您的问题的示例...

<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

【讨论】:

  • 对不起,伙计,我误读了你的问题,我首先注意到你的剃须刀代码中有语法错误。我会编辑我的答案
【解决方案2】:

您需要使用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 方法或 UrlPathEncode 方法。但是,这些方法返回不同的结果。 UrlEncode 方法将每个空格字符转换为加号字符 (+)。 UrlPathEncode 方法将每个空格字符转换为 字符串“%20”,十六进制表示空格。

【讨论】:

  • 我不确定 OP 的情况,但对我来说这是正确的,但只是在一定程度上。我需要同时处理空格和 & 符号。 UrlPathEncode 将正确处理空间但不正确地处理 & 符号。仍然 +1,因为它为我指明了正确的方向。
【解决方案3】:

我知道这有点老了,但是当我试图找出对 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 也会同样有效,但似乎这可能有点过头了。

警告:我什至没有使用远程各种各样的浏览器和电子邮件客户端对此进行测试

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
相关资源
最近更新 更多