3

今天我一直在尝试在微软开发的MVC 4 Facebook API中编程一点(基于示例:http ://www.asp.net/mvc/tutorials/mvc-4/aspnet-mvc-facebook -生日应用

到目前为止,我设法操纵了 MyAppUser 模型等。一切正常并按预期工作。当我通过控制器切换时,我只有一个小问题。

有没有办法通过控制器保留 FacebookContext 对象?

不幸的是,上面的示例(来自 Microsoft)仅在 Home 控制器中加载 MyAppUser,如下所示:

    [FacebookAuthorize("email", "user_photos")]
    public async Task<ActionResult> Index(FacebookContext context) {
        if (ModelState.IsValid) {
            var user = await context.Client.GetCurrentUserAsync<MyAppUser>();
            return View(user);
        }

        return View("Error");
    }

如果我在应用程序中使用另一个控制器,我该怎么办?如何获取 FacebookContext 引用以获取用户?

我尝试过的事情:

将 FacebookContext 上下文放入另一个控制器(始终为空)

将 FacebookContext 对象放入 Session 或 ViewBag - 无济于事,而且听起来太脏了。

我在这里错过了一些重要的东西吗?

我只是想拥有一个不同的控制器,它有几个操作来管理用户的个人资料,这将与 Facebook 的数据完全分开(通过本地托管的数据库)。我需要加载上下文的唯一原因是获取当前用户的电子邮件地址以在此基础上创建他们的帐户。

任何帮助将不胜感激,因为我花了相当多的时间试图修复它。

我的示例控制器可能是:

        public ActionResult Manage()
    {
            var user = await context.Client.GetCurrentUserAsync<Models.MyAppUser>();
            if (MyDALFunction.GetUserByMail(user.Email) == null) {
                // Create user functions, create a ViewModel, pass it on and do some editing.
            }
            return View(user);

    }
4

2 回答 2

3

这就是我解决这个问题的方法:

首先,在 Home Controller 中,我将访问令牌保存到 TempData

    public async Task<ActionResult> Index(FacebookContext context)
    {
        if (ModelState.IsValid)
        {
            this.TempData["accessToken"] = context.AccessToken;

然后我在不同控制器的另一个动作中阅读它。如果访问令牌为空,则表示用户未登录,因此我将他重定向到 Home 控制器。

        var accessToken = TempData["accessToken"] as string;
        if (string.IsNullOrEmpty(accessToken))
        {
            //if access token is null or user is not logged in, redirect to home controller
            return RedirectToAction("Index", "Home");
        }
        else
        {
            var fb = new Facebook.FacebookClient(accessToken);
            var me = fb.Get("me") as Facebook.JsonObject;  //current logged user
            var userFacebookId = me["id"].ToString();

您可以阅读电子邮件,而不是“id”。

编辑:当我尝试在另一个控制器中执行此操作时,从TempData返回中检索 accessToken 。null最好将其存储在其中Session

在 ASP.NET MVC 中将 Facebook 访问令牌存储在哪里?

于 2013-11-18T14:17:19.417 回答
1

抱歉,回答太晚了.. 但如果我正确理解了您的问题,那么我认为您正在尝试在回发发生时在您的 Action Method 中获取 FacebookContext 对象。如果是这样,那么.. 在您的 .cshtml 中尝试放置

<a target="_top" href="@GlobalFacebookConfiguration.Configuration.AppUrl@Url.Action("Manage", new { friendId = friend.Id })" role="button" class="btn btn-success">

然后让你的动作方法像......

public ActionResult Manage(string friendId, FacebookContext context)
{
    var friend = await context.Client.GetFacebookObjectAsync<MyAppUserFriend>(friendId);
    // var user = await context.Client.GetCurrentUserAsync<Models.MyAppUser>();
    if (MyDALFunction.GetUserByMail(friend.Email) == null) {
        // Create user functions, create a ViewModel, pass it on and do some editing.
    }
    return View(user);
}

但是请确保您的MyAppUserFriend模型具有 Email 属性。如果您想要其他任何东西,请提供您的模型视图的一些详细信息

于 2013-11-17T04:52:04.910 回答