ASP.NET 7中Razor Page组件Ajax调用返回500错误求助
核心问题分析
1. LoadData方法清空所有Session导致数据丢失
你的LoadData方法第一行执行_sessionService.ClearAllSessions();,会清除所有Session数据,包括之前存储的课程列表。当OnGetRemoveItem调用LoadData后,从Session获取OnlineCourseSelectionVM得到的是null,后续执行OnlineCourseSelectionVM.Where(...)会直接抛出空引用异常,这是500错误的直接诱因。
2. 局部变量覆盖类成员变量
在LoadData中,你声明了局部变量OnlineCourseSelectionViewModel OnlineCourseSelectionVM = ...,而非给类的成员变量赋值。这导致类成员变量OnlineCourseSelectionVM始终为null,后续调用OnlineCourseSelectionVM.Remove(...)必然触发空引用异常。
3. Session键名不匹配
OnGetRemoveItem中用SetListInSession("OnlineCourseSelectionVM", ...)保存数据,但LoadData里却用GetSensitiveSessionData<OnlineCourseSelectionViewModel>("courseVM")读取,键名完全不一致,无法正确获取Session数据,最终还是得到null。
4. 未处理潜在的null值
OnlineCourseSelectionVM.Where(...).FirstOrDefault()可能返回null(找不到对应eventId的项时),若OnlineCourseSelectionVM本身为null,执行后续操作会直接报错。
修复步骤
步骤1:修正LoadData方法
移除全局Session清空操作,修正变量赋值逻辑和Session键名:
public void LoadData() { // 移除全局Session清空,避免丢失已有数据 // _sessionService.ClearAllSessions(); // 处理ItemList的Session存储(按需保留) _sessionService.SetSensitiveSessionData("ItemList", itemList, TimeSpan.FromMinutes(30)); RetrievedItemList = _sessionService.GetSensitiveSessionData<List<D>>("ItemList"); // 给类成员变量赋值,而非声明局部变量 OnlineCourseSelectionVM = _sessionService.GetSensitiveSessionData<OnlineCourseSelectionViewModel>("OnlineCourseSelectionVM"); // 初始化空列表,避免null异常 if (OnlineCourseSelectionVM == null) { OnlineCourseSelectionVM = new OnlineCourseSelectionViewModel(); } // 使用统一的键名保存回Session _sessionService.SetSensitiveSessionData("OnlineCourseSelectionVM", OnlineCourseSelectionVM, TimeSpan.FromMinutes(30)); }
步骤2:优化OnGetRemoveItem方法
增加null检查,避免空引用:
public IActionResult OnGetRemoveItem(int eventId) { LoadData(); // 先检查列表是否为空 if (OnlineCourseSelectionVM == null) { return new BadRequestResult(); } // 增加空安全访问,避免SelectedCourse为null时报错 var removedItem = OnlineCourseSelectionVM.Where(item => item.SelectedCourse?.event_id == eventId).FirstOrDefault(); // 仅在找到项时执行移除操作 if (removedItem != null) { OnlineCourseSelectionVM.Remove(removedItem); _sessionService.SetSensitiveSessionData("OnlineCourseSelectionVM", OnlineCourseSelectionVM, TimeSpan.FromMinutes(30)); } // 无需重复调用LoadData,已更新Session数据 // LoadData(); return ViewComponent("SelectedCourse", this); }
步骤3:调试获取详细错误信息
在Program.cs中启用开发者异常页面(仅开发环境),查看具体异常详情:
if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); }
打开浏览器F12的网络标签,查看Ajax请求的响应内容,里面会包含完整的异常堆栈信息,帮助精准定位问题。
步骤4:修正Ajax回调的容器ID
cshtml中容器ID为OnlineCoursesRegContainer,但Ajax回调中更新的是selectedCoursesContainer,ID不匹配会导致页面不更新,需修正:
success: function (result) { $("#OnlineCoursesRegContainer").html(result); },
内容的提问来源于stack exchange,提问作者POKA

