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

ASP.NET Core Identity查询ApplicationUser返回null致视图报错如何解决

问题产生原因

核心错误出在用户查询的参数传递和逻辑校验缺失:

  1. DbSet<T>.Find() 方法的查询逻辑是按表的主键匹配记录,你自定义的ApplicationUser继承自IdentityUser,主键是Id字段,对应从用户声明里取到的userId(即ClaimTypes.NameIdentifier对应的值),不是UserName。你把用户名作为参数传给Find,数据库里没有主键值等于用户名的记录,自然返回null。
  2. 代码里标注的// For ASP.NET Core <= 3.1注释是错误的,不管哪个版本的ASP.NET Core Identity,用户表的主键默认都是Id字段,从来没有用UserName作为主键的默认配置,传用户名给Find在任何版本都查不到正确结果。
  3. 代码没有做非空校验,查询到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:54:04