ASP.NET MVC Razor页面foreach空引用异常排查求助
错误分析与修复方案
核心错误根源
你遇到的Object reference not set to an instance of an object是因为Razor页面的Model为null,调试器指向foreach代码段是因为你直接遍历未赋值的Model。以下是具体问题和修复步骤:
1. 控制器List方法未传递模型数据
你的SeminarController中List方法仅返回视图,未将用户列表传递给视图:
public IActionResult List() { return View(); // 未传入模型数据 }
修复后:
public IActionResult List() { return View(Repository.Users); // 将仓储中的用户列表传递给视图 }
2. 仓储类的多处问题
- 静态构造函数类型不匹配:你用
new KullaniciBilgi()初始化数据,但模型类是UserInfo,需统一类型:
static Repository() { // 替换KullaniciBilgi为UserInfo _users.Add(new UserInfo() { Id = 1, Name = "Busra", Email = "blablabla@gmail.com", Phone = "111111111", WillAttend = true }); _users.Add(new UserInfo() { Id = 2, Name = "Nur", Email = "blablabla@gmail.com", Phone = "8384388438", WillAttend = true }); _users.Add(new UserInfo() { Id = 3, Name = "Busra", Email = "blablabla@gmail.com", Phone = "3438848384", WillAttend = true }); }
- 方法名称不匹配:控制器
Details方法调用Repository.TakeId(id),但仓储中对应方法是IdAl,需统一名称:
要么修改仓储方法名:
要么修改控制器调用:public static UserInfo? TakeId(int id) { return _users.FirstOrDefault(user => user.Id == id); }public IActionResult Details(int id) { return View(Repository.IdAl(id)); } CreateUser方法ID赋值逻辑错误:当前代码先添加用户再赋值ID,会导致ID重复,需调整顺序:
public static void CreateUser(UserInfo user) { user.Id = _users.Count + 1; // 先赋值ID,再添加到列表 _users.Add(user); }
3. Razor页面HTML结构错误
你的foreach中<tr>标签提前闭合,导致<td>脱离表格行结构,同时遗漏了Email列输出,路由路径也和控制器名称不匹配:
@foreach(var user in Model) { var status = user.WillAttend ? "Evet" : "Hayır"; var classname = user.WillAttend ? "table-success" : "table-danger"; if(user.WillAttend) { i++; <tr class="@classname"> <td>@user.Name</td> <td>@user.Email</td> <!-- 补上遗漏的Email列 --> <td>@status</td> <td> <a class="btn btn-sm btn-primary" href="/Seminar/details/@user.Id">Detail</a> <!-- 路由与控制器名称Seminar保持一致,修正seminer拼写 --> </td> </tr> } }
4. 可选的空值防护
为避免Model为空时的异常,可在Razor页面开头添加空值判断:
@if (Model == null || !Model.Any()) { <p>暂无用户数据。</p> } else { <!-- 表格代码 --> }
内容的提问来源于stack exchange,提问作者Büşra Nur
相关产品推荐
相关产品推荐

