ASP.NET Core Identity查询ApplicationUser返回null致视图报错如何解决
问题产生原因
核心错误出在用户查询的参数传递和逻辑校验缺失:
DbSet<T>.Find()方法的查询逻辑是按表的主键匹配记录,你自定义的ApplicationUser继承自IdentityUser,主键是Id字段,对应从用户声明里取到的userId(即ClaimTypes.NameIdentifier对应的值),不是UserName。你把用户名作为参数传给Find,数据库里没有主键值等于用户名的记录,自然返回null。- 代码里标注的
// For ASP.NET Core <= 3.1注释是错误的,不管哪个版本的ASP.NET Core Identity,用户表的主键默认都是Id字段,从来没有用UserName作为主键的默认配置,传用户名给Find在任何版本都查不到正确结果。 - 代码没有做非空校验,查询到null之后直接把null传给强类型视图,视图访问
Model.FullName时就会触发空引用异常,对应你看到的报错:
Object reference not set to an instance of an object
Model.get returned null
修复方案
按照以下步骤调整代码即可:
- 替换
Find方法的传入参数,把userName改成正确的主键值userId。 - 增加两层非空判断:首先判断当前请求是否携带已登录用户的身份声明,未登录直接跳转登录页;其次判断查询到的用户对象是否为空,避免极端场景下的空引用。
- 可选优化:在视图侧增加Model非空判断,作为兜底逻辑。
修正后的控制器代码:
public IActionResult test() { // 获取当前登录用户的主键ID var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); // 未登录场景处理 if (string.IsNullOrWhiteSpace(userId)) { return RedirectToAction("Login", "Account"); } // Find方法按主键查询,传入正确的userId参数 ApplicationUser applicationUser = _db.ApplicationUser.Find(userId); // 用户不存在场景处理 if (applicationUser == null) { return NotFound("对应用户信息不存在"); } string userEmail = applicationUser.Email; return View(applicationUser); }
视图侧可选兜底代码(非必须,推荐优先在控制器处理空值):
@model Store.Models.ApplicationUser @{ ViewData["Title"] = "test"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h1>test</h1> @if (Model != null) { <h1>@Model.FullName</h1> <p>注册邮箱:@Model.Email</p> } else { <p>暂未查询到用户信息</p> }
内容的提问来源于stack exchange,提问作者Mina Mosa
相关产品推荐
相关产品推荐

