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
相关产品推荐
相关产品推荐

