在ASP.NET MVC中编码Facebook共享URL

时间:2013-12-21 13:29:18

标签: c# asp.net-mvc

在ASP.NET MVC 5上,我有以下Facebook共享链接:

@{  
  var link = String.Format("http://www.facebook.com/sharer.php?s=100&p[url]={0}&p[title]={1}", "http://mysite.xyz", "This is my site");

}

<a href="@link">share in facebook</a>

当我验证生成的html时,我收到以下错误:

Bad value http://www.facebook.com/sharer.php?s=100&p[url]=http://mysite.xyz&p[title]=This is my site for attribute href on element a: Illegal character in query component.

我尝试编码如HttpUtility.UrlEncode,HttpUtility.UrlPathEncode,......

但我要么松散,要么在路径之前获取本地主机,因为有%20或页面HTML未经过验证而出现安全问题......

定义锚点的正确方法是什么?

更新

我现在正在尝试以下方法:

@{   
  var link = String.Format("http://www.facebook.com/sharer.php?s=100&p[url]={0}&p[title]={1}", HttpUtility.UrlEncode("http://mysite.xyz"), HttpUtility.UrlEncode("This is my site"));    
}

<a href="@Html.Raw(Html.AttributeEncode(link))">share in facebook</a>

但是我无法在HTML Validator中验证这一点。我收到错误:

Bad value http://www.facebook.com/sharer.php?s=100&p[url]=http%3a%2f%2fmysite.xyz&p[title]=This+is+my+site for attribute href on element a: Illegal character in query component.

更新2

我能够解决所有社交分享链接,但有一个仍然给我一些问题。

我有以下mailto链接:

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

这是未经过验证的,如果我使用与社交链接相同的方法,我会收到邮件正文和主题中的所有奇怪字符。

这可以解决吗?

谢谢你, 米格尔

1 个答案:

答案 0 :(得分:2)

您应该对查询字符串参数的值进行URL编码:

var link = string.Format(
    "http://www.facebook.com/sharer.php?s=100&p%5Burl%5D={0}&p%5Btitle%5D={1}", 
    Url.Encode("http://mysite.xyz"),
    Url.Encode("This is my site")
);

并在生成锚点时使用Html.AttributeEncode

<a href="@Html.Raw(Html.AttributeEncode(link))">share in facebook</a>