ASP.NET Core MVC控制器中如何正确使用SignInManager与UserManager
问题原因
你当前的错误完全是UserManager、SignInManager的注入方式错误导致的:
- 你把两个服务的变量声明直接写在了命名空间外面,属于C#顶级语句的局部变量,控制器类内部无法访问,也没有被依赖注入容器赋值,所以会报CS8801错误。
- Razor页面的
@inject是页面专属的注入语法,控制器中不能用这种方式,需要走构造函数注入的标准流程。
修正步骤
1. 改写AccountController代码
把两个服务的声明移到控制器类内部,通过构造函数注入赋值,同时把同步调用.Result改成异步await避免死锁:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Card.Areas.Identity.Data; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Card.Models; namespace Card.Controllers { [Authorize] public class AccountController : Controller { private readonly TransactionConnection _tc; // 把两个服务声明移到控制器类内部作为私有字段 private readonly SignInManager<CardUs> _signInManager; private readonly UserManager<CardUs> _userManager; // 构造函数新增两个服务的入参,DI容器会自动注入实例 public AccountController(TransactionConnection tc, SignInManager<CardUs> signInManager, UserManager<CardUs> userManager) { _tc = tc; _signInManager = signInManager; _userManager = userManager; } public IActionResult Index() { return View(); } public IActionResult Transactions() { var results = _tc.TransactionHistory.ToList(); return View(results); } [HttpGet] public IActionResult Deposit() { return View(); } // 改成异步方法,用await调用异步方法避免死锁 [HttpPost] public async Task<IActionResult> Deposit(DepositModel model) { var user = await _userManager.GetUserAsync(User); int test = model.AccountBalance + user.AccountBalance; return Content($"this is how much you entered {test}"); } public IActionResult Transfers() { return View(); } } }
2. 后续操作提示
后续要更新余额到数据库的时候,直接调用await _userManager.UpdateAsync(user)即可,不需要自己手动写数据库更新逻辑,UserManager已经封装了相关操作。
内容的提问来源于stack exchange,提问作者Anime Zone
相关产品推荐
相关产品推荐

