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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:15:09