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

ASP.NET Core Identity注册页绑定多表下拉框遇空引用问题求助

解决ASP.NET Core Identity注册页面下拉框空引用异常问题

1. 核心问题:未给PageModel的Input属性赋值

你的LoadInputModel方法里新建了InputModel对象,但没有将它赋值给页面模型(RegisterModel)的Input属性。页面中使用@Model.Input.CategoryList时,Model.Input为null,直接触发空引用异常。

修改LoadInputModel方法:

private Task LoadInputModel()
{
    // 直接初始化或赋值给PageModel的Input属性
    Input = new InputModel()
    {
        CompanyList = _unitOfWork.Company.GetAll().Select(i => new SelectListItem()
        {
            Text= i.Name,
            Value = i.Id.ToString()
        }).ToList(), // 转为List避免延迟加载问题
        DepartmentList = _unitOfWork.Department.GetAll().Select(i => new SelectListItem()
        {
            Text= i.Name,
            Value = i.Id.ToString()
        }).ToList(),
        DesignationList = _unitOfWork.Designation.GetAll().Select(i => new SelectListItem()
        {
            Text= i.Name,
            Value = i.Id.ToString()
        }).ToList(),
        RankList = _unitOfWork.Rank.GetAll().Select(i => new SelectListItem()
        {
            Text= i.Name,
            Value = i.Id.ToString()
        }).ToList(),
        CategoryList = _unitOfWork.Category.GetAll().Select(i => new SelectListItem()
        {
            Text= i.Name,
            Value = i.Id.ToString()
        }).ToList()
    };

    return Task.CompletedTask;
}

2. 确认UnitOfWork已正确注入

检查RegisterModel的构造函数,确保_unitOfWork已通过依赖注入获取实例,没有为null:

private readonly IUnitOfWork _unitOfWork;
private readonly SignInManager<IdentityUser> _signInManager;
// 其他依赖...

public RegisterModel(SignInManager<IdentityUser> signInManager, 
                     IUnitOfWork unitOfWork,
                     // 其他服务...)
{
    _signInManager = signInManager;
    _unitOfWork = unitOfWork;
    // 初始化其他依赖
}

同时确保在Program.cs中已注册UnitOfWork服务:

builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();

3. 处理潜在的延迟加载问题

将Select后的结果调用.ToList(),把IQueryable转为List,避免页面渲染时EF上下文已释放导致的异常(如果你的GetAll()返回的是IQueryable)。

4. 可选:空值保护

在InputModel的集合属性初始化时,设置默认空集合,避免后续意外空引用:

public IEnumerable<SelectListItem> CompanyList { get; set; } = new List<SelectListItem>();
public IEnumerable<SelectListItem> DepartmentList { get; set; } = new List<SelectListItem>();
// 其他集合属性同理

内容的提问来源于stack exchange,提问作者rehman mustafa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:48:10