我有以下代码来检查用户是否喜欢我的标签:
protected bool IsPageLiked()
{
try
{
var current = ConfigurationManager.GetSection("facebookSettings")
as IFacebookApplication;
dynamic data = FacebookWebContext.Current.SignedRequest.Data;
if (data.page != null)
{
var pageId = (String)data.page.id;
var isUserAdmin = (Boolean)data.page.admin;
var userLikesPage = (Boolean)data.page.liked;
if (userLikesPage)
return true;
}
}
catch (Exception ex)
{
return false;
}
return false;
}
最初加载标签时,此功能正常。 但是,如果我在选项卡中更改页面后尝试调用相同的代码,则会出现以下错误:
{“前提条件失败:!String.IsNullOrEmpty(signedRequestValue)”}
有没有办法让我的代码在第一页之后工作?
我知道我可以检查第一页上是否喜欢该标签,并将其放入会话对象或其他内容,但我不想这样做。
我的应用程序本身就是MVC 3
由于
修改
我认为发生的事情是当我更改页面时(我正在使用RedirectToAction方法),它正在丢失signed_request查询字符串,因此我得到了错误。
修改2
毕竟不确定上面是什么,因为我在初始页面上看不到任何查询字符串值?它仍然无法获得签名请求。
看起来signed_request是一个表单对象(Request.Form [“signed_request”]返回初始页面中的字符串,但不返回第二页)。
答案 0 :(得分:1)
页面标签基本上只是您网页上iframe中的应用,就像您已经注意到已签名的请求在页面加载时张贴到标签页。
当您在标签中更改页面时,外部Facebook框架没有重新加载,因此signed_request不会重新发布到您的标签页,这就是您无法再次访问它的原因。
您需要将signed_request从一个页面传递给下一个页面,或者确保所有链接都使用target =“_ top”,以便每次重新加载整个页面并且您仍然可以获得POST。
要定义您希望加载标签的页面,可以在标签的网址中使用名为app_data的其他参数,例如
http://www.facebook.com/MY_PAGE?sk=app_MY_APP_ID&app_data=A_STRING_OF_DATA
然后,您的标签会在signed_request中收到此标签,您可以抓住它并使用它来确定标签需要显示的页面。