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

ASP.NET Core Razor Pages填充下拉列表出现空引用异常如何解决?

问题根因排查

导致@Model.Instructors触发空引用的核心原因有两类:

  1. POST提交后返回页面未重新赋值:这是最常见的场景。当你提交表单执行OnPostAsync逻辑时,如果验证失败调用return Page()重新渲染视图,Instructors属性不会自动保留之前的赋值,此时该属性为null,视图访问就抛出异常。
  2. GET流程赋值逻辑未执行:OnGetAsync方法执行过程中提前抛出异常(比如User_Profile查询出错),导致后续Instructors的赋值代码没有被运行,属性保持默认null值。
解决方案

1. 统一封装下拉列表加载逻辑

将讲师下拉列表的加载逻辑抽为独立方法,在所有需要渲染页面的节点都调用:
首先在cshtml.cs中添加封装方法:

// 异步版本更推荐,避免同步查询阻塞
private async Task LoadInstructorsAsync()
{
    var instructors = await _context.Instructor
                            .OrderBy(i => i.FirstName)
                            .ToListAsync();
    Instructors = new SelectList(instructors, "ID", "FirstName");
}

修改OnGetAsync调用该方法:

public async Task OnGetAsync()
{
    var students = from s in _context.User_Profile
                   select s;

    if (!string.IsNullOrEmpty(SearchString))
    {
        students = students.Where(s => s.FirstName.Contains(SearchString));
    }

    UserProfile = await students.ToListAsync();
    // 加载讲师下拉
    await LoadInstructorsAsync();
}

修改OnPostAsync方法,返回页面前重新加载:

public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
    {
        // 验证失败返回页面前必须重新加载下拉数据
        await LoadInstructorsAsync();
        return Page();
    }

    // 你的表单保存、跳转逻辑
    _context.Class_Info.Add(Class_Info);
    await _context.SaveChangesAsync();
    return RedirectToPage("./Index");
}

2. 兜底空值初始化(可选)

直接给Instructors属性设置默认空值,即使加载逻辑未执行也不会触发空引用:

public SelectList Instructors { get; set; } = new SelectList(Enumerable.Empty<SelectListItem>());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:01