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

为何会触发NullReferenceException空引用异常?

解决AddToRoleAsync触发NullReferenceException的问题

异常信息

Exception: NullReferenceException: Object reference not set to an instance of an object.

报错代码位置

报错发生在这行代码:

await _userManager.AddToRoleAsync(user, Input.Role);

完整代码参考

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl ??= Url.Content("~/");
    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();

    if (ModelState.IsValid)
    {
        var user = CreateUser();
        await _userStore.SetUserNameAsync(user, Input.Email, CancellationToken.None);
        await _emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None);

        var result = await _userManager.CreateAsync(user, Input.Password);

        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");
        
            if (Input.Role != null) 
            {
                await _userManager.AddToRoleAsync(user, Input.Role);
            }
            else
            {
                await _userManager.AddToRoleAsync(user, Roles.Role_User_Cust);
            }

            var userId = await _userManager.GetUserIdAsync(user);
            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            var callbackUrl = Url.Page("/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
                protocol: Request.Scheme);
        }
    }
    // 注意:原代码缺少返回语句,建议补充return Page();或对应跳转逻辑
}

排查与修复方案

NullReferenceException的核心是某个对象未实例化就被调用,针对这个场景逐一排查:

  • _userManager 未正确注入
    确认项目已配置角色支持,在Program.cs/Startup.cs中必须包含AddRoles配置:

    builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();
    

    同时确保页面模型构造函数正确注入UserManager<TUser>:

    private readonly UserManager<IdentityUser> _userManager;
    public YourPageModel(UserManager<IdentityUser> userManager)
    {
        _userManager = userManager;
    }
    
  • Input 对象为空
    原代码直接访问Input.Role,如果Input未通过模型绑定实例化会触发空引用,添加前置检查:

    if (Input == null)
    {
        ModelState.AddModelError(string.Empty, "输入数据无效");
        return Page();
    }
    

    同时确认页面表单的asp-for属性与Input类的Role字段对应,保证模型绑定正常。

  • user 对象为空
    检查CreateUser()方法,确保返回有效用户实例而非null:

    private IdentityUser CreateUser()
    {
        return new IdentityUser();
        // 或使用Activator,确保类存在无参构造函数
    }
    
  • 优化空值判断逻辑
    将原有的Input.Role != null替换为更安全的空值检查,避免Input为空时触发异常:

    if (!string.IsNullOrEmpty(Input?.Role)) 
    {
        await _userManager.AddToRoleAsync(user, Input.Role);
    }
    else
    {
        await _userManager.AddToRoleAsync(user, Roles.Role_User_Cust);
    }
    

内容的提问来源于stack exchange,提问作者Yuvi Rajput

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:38:39