我使用局部视图来呈现用户在我的应用程序中拥有的项目总数。我目前在我的母版页上有这个:
<%= Html.Action("MyItemsTotal", "Home") %>
在我的家庭控制器中我有这个动作方法:
[ChildActionOnly]
public ActionResult MyItemsTotal()
{
FacebookApp app = new FacebookApp();
ViewData["count"] = "0";
int count = 0;
if (app.Session != null)
count = (from i in db.Items
where i.UserID == app.Session.UserId &&
i.Status != "D"
select i).Count();
if (count > 0)
ViewData["count"] = count.ToString("#,#");
return PartialView();
}
问题是app.Session为null,即使在加载页面之前我正在使用Url.CanvasAction,所以我在浏览器中的url如下所示:
http://apps.facebook.com/mysite/Home
我认为只要我留在facebook域(即apps.facebook.com)中,用户会话就维持了......?
之前我使用的是Html.Action但是因为安装了最新版本的SDK(v 4.1.1)它已经不再工作了......最新版本有什么改变以防止Html.Action现在工作? ?
我是否可以使用Html.Action作为示例Html.CanvasAction来渲染部分视图? (显然那里没有一个......)
此致 罗布
答案 0 :(得分:0)
Facebook.Web.Mvc项目中有一些类可以为HtmlHelper,UrlHelper和Controller类添加扩展方法。你会发现如下的扩展名:
Html.CanvasAction Url.CanvasAction this.CanvasRedirect(在控制器中,它是一个扩展,所以你必须使用'this')
我们已经为每个方法处理了MVC框架提供的所有相同重载。
答案 1 :(得分:0)
纯粹是偶然的,我想我已经弄清楚了SDK的运作方式!
对SDK开发人员的一个附注,你做得很好,但尝试更好地解释一下......使用图片和数据流,这样人们可以更快地使用你的精彩sdk!
如果在您的Facebook设置中启用了此设置:
根据文档,它说明facebook会将会话数据和其他信息作为表单字段发布到您的终点。 e.g。
<input "signed-request" value="...
他们没有说的是,这只适用于您所在的域名,即:
http://apps.facebook.com/<yourAppNameHere>
它不会在其域外发布任何内容,例如:
http://www.<yourAppNameHere>.com
现在你想想,好吧!但等等还有更多!
如果您喜欢我和您使用带有Iframe Canvas的Asp.Net MVC作为您在facebook中的应用程序设置,那么当您尝试使用辅助方法渲染部分页面(在webforms中有效地进行用户控制)时,您将此包含在页:
&lt;%= Html.Action(“MyItemsTotal”,“Home”)%&gt;
不幸的是,在Home控制器的MyItemsTotal操作方法中,您将不会收到会话数据。为什么要问......因为Asp.Net MVC正在使用Get Request!
因此,您的会话数据不再存在于该上下文中。您有效地呼叫自己的域名。
在我的情况下,我只是想要检索userId,所以我可以做这样的事情:
&lt;%= Html.Action(“MyItemsTotal”,“Home”,新的RouteValueDictionary {{“UserID”,FbApp.Session.UserId}})%&gt;
并在回来时询问。
更好的方法是使用会话助手类来维护FacebookApp继承的用户会话。出于所有意图和目的,我可以以我喜欢的任何方式使用它,并且它足够智能,可以在任何上下文中存储和公开当前用户信息。那么问题就出现了,那么从Facebook外部进入你网站的用户呢,新的FacebookApp类将如何确定?
我的答案是,它不需要知道哪个域名正在调用它,它只需要知道如果它没有被使用它将在一定时间内到期。为了保持完整性,第四个人必须使用会话ID或facebook传递给应用程序的唯一标识符。
有些值得深思的想法:-P