我在ASP.NET MVC 5应用程序上有以下mailto链接:
share by email
这不是在HTML Validator上验证.我收到错误:
错误值mailto:?subject =主题&body =这是url:%0D%0Ahttp:// localhost:8580/home表示元素a上的属性href:查询组件中的空格.使用%20代替空格.
我尝试使用编码,HttpUtility.UrlEncode
但是当我打开电子邮件时,我会在主题和正文中得到"+"符号和其他人,我无法解决这个问题.
您需要使用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方法对URL进行编码.但是,这些方法会返回不同的结果.UrlEncode方法将每个空格字符转换为加号字符(+).UrlPathEncode方法将每个空格字符转换为字符串"%20",该字符串表示十六进制表示法的空格.
我知道这有点旧,但当我试图找出编码mailto链接的最佳方法时,我遇到了这个问题.我发现最好的方法是使用Uri.EscapeDataString
每个参数,然后使用HttpUtility.HtmlAttributeEncode对整个属性进行编码:
HttpUtility.HtmlAttributeEncode( String.Format("mailto:?subject={0}&body={1}", Uri.EscapeDataString(subject), Uri.EscapeDataString(body)))
HttpUtility.UrlEncode
并且HttpUtility.UrlEncodeUnicode
没有正确编码空格 - 它们变成加号("+"),然后在主题行/正文/等中显示为加号.HttpUtility.UrlPathEncode
似乎解决了这个问题,但没有正确编码其他字符,如?,#和/.Uri.EscapedDataString
似乎是唯一正确编码所有这些字符的方法.我想Uri.HexEscape
也会同样有效,但看起来可能有点矫枉过正.
警告:我甚至没有对各种各样的浏览器和电子邮件客户端进行测试