You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Facebook集成API问题:CSHTML页面无返回结果求助

排查Facebook登录后页面无数据显示的问题

我来帮你梳理下这个问题,从你的代码和描述来看,页面没有显示用户信息大概率是TempData的特性限制或者跳转逻辑的小问题,咱们一步步来解决:

1. 核心问题:TempData的生命周期导致数据丢失

你在FacebookCallback里把用户信息存到TempData,然后通过RedirectToAction跳转到Login页面——这里要注意:TempData默认是单次请求有效,而且RedirectToAction是客户端跳转(会发起新的HTTP请求),这时候TempData里的数据很容易在跳转过程中丢失,或者在读取一次后就被标记为删除。

解决办法:

方案一:保留TempData数据

在Login页面读取TempData时,使用Peek()方法(不会标记数据为删除),或者读完后调用Keep():

<!-- Login.cshtml 修改后 -->
@Html.ActionLink("Login with facebook", "Facebook", "Login")

@if (TempData.Peek("email") != null)
{
    <table>
        <tr><td>Email:</td><td><b>@TempData.Peek("email")</b></td></tr>
        <tr><td>First Name:</td><td><b>@TempData.Peek("first_name")</b></td></tr>
        <tr><td>Last Name:</td><td><b>@TempData.Peek("lastname")</b></td></tr>
        <tr><td>Picture:</td><td><b><img src="@TempData.Peek("picture")" /></b></td></tr>
    </table>
}

或者在Login控制器的Login方法里主动保留数据:

public ActionResult Login()
{
    // 保留所有TempData数据
    TempData.Keep();
    // 或者单独保留指定字段
    // TempData.Keep("email");
    // TempData.Keep("first_name");
    return View();
}

方案二:改用Session存储数据

Session是跨请求持久的(只要会话未过期),比TempData更适合存储登录后的用户信息:

// FacebookCallback方法修改存储逻辑
Session["email"] = me.email;
Session["first_name"] = me.first_name;
Session["lastname"] = me.last_name;
Session["picture"] = me.picture.data.url;

然后在Login.cshtml里读取Session:

@Html.ActionLink("Login with facebook", "Facebook", "Login")

@if (Session["email"] != null)
{
    <table>
        <tr><td>Email:</td><td><b>@Session["email"]</b></td></tr>
        <tr><td>First Name:</td><td><b>@Session["first_name"]</b></td></tr>
        <tr><td>Last Name:</td><td><b>@Session["lastname"]</b></td></tr>
        <tr><td>Picture:</td><td><b><img src="@Session["picture"]" /></b></td></tr>
    </table>
}

2. 检查跳转逻辑的正确性

你在FacebookCallback里写的是:

return RedirectToAction("Login", "login");

ASP.NET MVC中Controller名称是约定首字母大写的,如果你的控制器类是LoginController,第二个参数应该是"Login"(大写L),否则可能跳转到错误的页面,导致数据无法传递:

return RedirectToAction("Login", "Login");

3. 调试确认数据是否正确获取

加个断点在FacebookCallback方法里,确认dynamic me = fb.Get("me?fields=...")是否正确获取到了用户数据:

  • 检查Facebook应用的权限设置:email字段需要用户授权,公开应用还需要通过Facebook的审核(测试应用可以用测试用户跳过审核)
  • 确认返回的me对象里是否包含email、first_name等字段,有时候Facebook API会因为权限不足返回空值

4. 额外优化:避免空表格显示

在Login.cshtml里加个判断,只有当存在用户数据时才渲染表格,避免页面看起来“无结果”:

@Html.ActionLink("Login with facebook", "Facebook", "Login")

@* 只有当有数据时才显示表格 *@
@if (TempData.Peek("email") != null || Session["email"] != null)
{
    <table>
        <!-- 表格内容 -->
    </table>
}

内容的提问来源于stack exchange,提问作者Dev George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:50:26