ASP.NET Core Razor Pages填充下拉列表出现空引用异常如何解决?
问题根因排查
导致@Model.Instructors触发空引用的核心原因有两类:
- POST提交后返回页面未重新赋值:这是最常见的场景。当你提交表单执行
OnPostAsync逻辑时,如果验证失败调用return Page()重新渲染视图,Instructors属性不会自动保留之前的赋值,此时该属性为null,视图访问就抛出异常。 - 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
相关产品推荐
相关产品推荐

