ASP.NET Core MVC 登录后拉取用户数据报UserManager无法实例化错误如何解决
报错原因
- 直接触发报错的问题:Action方法
MySchedule多了多余的UserManager<IdentityUser> userManager入参。ASP.NET Core MVC默认会对Action的所有公开入参执行模型绑定,UserManager<>是Identity框架托管的服务,没有无参构造函数,模型绑定无法创建实例,直接触发报错。且你已经在控制器层面注入了UserManager<ApplicationUser>,这个入参完全没有存在必要。 - 隐藏的次生问题:
HomeController的构造函数写法错误,你加了void返回值,导致它变成了普通的类方法,而非控制器构造函数,依赖注入框架不会自动执行这个方法注入UserManager实例,哪怕删掉Action的多余参数,后续调用_userManager也会触发空引用异常。
修复方案
- 先修正控制器构造函数,删掉
void返回值:
private UserManager<ApplicationUser> _userManager; // 构造函数无返回值,参数保持不变 public HomeController(UserManager<ApplicationUser> userManager) { _userManager = userManager; }
- 删掉
MySchedule方法的多余UserManager<IdentityUser> userManager入参,修正后的Action代码如下:
public async Task<IActionResult> MySchedule() { var CourseChosen = from m in _context.CourseChosen select m; var userid = _userManager.GetUserId(HttpContext.User); if (userid == null) { return RedirectToAction("Login", "Account"); } else { ApplicationUser user = await _userManager.GetUserAsync(User); var identification = user.StudentId; CourseChosen = CourseChosen.Where(x => x.StudentId == identification); var coursechosen = new MyCourse { MyCourses = await CourseChosen.ToListAsync() }; return View(coursechosen); } }
- 可选校验项:确认你的Startup.cs(.NET 5版本)中已经正确注册了Identity服务,指定了用户类型为
ApplicationUser,示例注册代码如下:
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<你的项目DbContext类名>();
内容的提问来源于stack exchange,提问作者Weber Wang
相关产品推荐
相关产品推荐

