为何会触发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
相关产品推荐
相关产品推荐

