我在ASP.NET MVC 5应用程序上有以下mailto链接:
<a rel="nofollow" href="@(
String.Format("mailto:?subject={0}&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
进行编码,但是当我打开电子邮件时,我会在主题和正文中获得“+”符号和其他内容,但我无法解决此问题。
答案 0 :(得分:15)
我知道这有点旧,但当我试图找出编码mailto链接的最佳方法时,我遇到了这个问题。我发现最好的方法是对每个参数使用Uri.EscapeDataString
,然后使用HttpUtility.HtmlAttributeEncode对整个属性进行编码:
HttpUtility.HtmlAttributeEncode(
String.Format("mailto:?subject={0}&body={1}",
Uri.EscapeDataString(subject),
Uri.EscapeDataString(body)))
HttpUtility.UrlEncode
和HttpUtility.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