如何解决@role.Name处出现的NullReferenceException空引用错误?
解决ASP.NET Razor视图中Role对象为空的NullReferenceException问题
问题代码
@foreach (var a in Model.USERS.OrderBy(p => p.NAMESURNAME)) { var role = Model.ROLLER.FirstOrDefault(p => p.ID == a.ROLID); <tr id="tr@(a.ID)"> <td>@a.NAMESURNAME</td> <td>@a.USERNAME</td> <td style="width:120px">@a.GOREV</td> <td>@a.EMAIL</td> <td>@a.PHONENUMBER</td> <td>@role.NAME</td> <td>@a.VERSİON</td> <td> <a asp-action="AddUser" asp-route-userId="@a.ID" data-container="body" data-toggle="m-popover" data-placement="top" data-content="Edit"><i class="flaticon-edit"></i></a> <a class="delete" data-id="@a.ID" data-id2="@a.NAMESURNAME" data-container="body" data-toggle="m-popover" data-placement="top" data-content="Delete"><i class="flaticon-delete"></i></a> </td> </tr> }
错误信息
System.NullReferenceException: 'Object reference not set to an instance of an object.'
错误核心是部分用户的ROLID在ROLLER集合中找不到匹配记录,导致FirstOrDefault返回null,后续访问role.NAME触发空引用异常。
解决办法
1. 视图层直接做空值防护
在访问角色名称前先判断role是否为空,用空合并运算符简化代码:
<td>@(role?.NAME ?? "无角色")</td>
或者用更直观的条件判断:
<td>@(role != null ? role.NAME : "无角色")</td>
2. 后端提前关联数据(推荐)
避免在视图中做数据匹配逻辑,在Controller或业务层提前将用户与角色关联:
如果使用EF Core,可以通过Include加载关联数据:
// 示例:在Controller中准备视图模型 var viewModel = new YourViewModel { // 提前加载用户对应的角色,避免视图中二次查询 USERS = _dbContext.USERS .Include(u => u.Role) // 假设实体类中有Role导航属性 .OrderBy(u => u.NAMESURNAME) .ToList(), // 其他属性赋值... }; return View(viewModel);
之后视图中直接访问@a.Role.NAME即可,无需额外查询。
3. 清理脏数据
检查数据库中是否存在ROLID无效的用户记录(即ROLID在角色表中无匹配项),修复这类脏数据:
- 给无效用户分配有效的角色ID
- 若允许用户无角色,将
ROLID设为可空类型,并在业务逻辑中处理默认值
内容的提问来源于stack exchange,提问作者ismail temel
相关产品推荐
相关产品推荐

