ASP.NET视图向控制器传递ID时报NullReferenceException错误如何解决
ASP.NET 视图传参到Post方法空引用异常排查
错误提示
System.NullReferenceException: 'Object reference not set to an instance of an object.'
Microsoft.AspNetCore.Mvc.Razor.RazorPage.Model.get returned null.
问题根因
- 核心原因:
[HttpPost]修饰的List方法执行删除逻辑后,直接调用return View(),没有向视图传递List<CarListViewModel>类型的模型数据。你的视图绑定了强类型模型,当Model为null时,代码中访问Model.Count、Model[i]等成员就会触发空引用异常。 - 潜在问题:删除逻辑中没有对
FirstOrDefault的返回结果做空校验,如果传入的carId不存在,Car变量为null,调用db.Cars.Remove(Car)时也会抛出空引用异常。 - 拼写隐患:你在GET方法的Select查询中实例化的是
CarsListViewModel,但定义的视图模型类名是CarListViewModel,如果是拼写错误会导致类型不匹配报错。
修复方案
- 调整Post方法的返回逻辑,使用PRG(Post-Redirect-Get)模式,删除完成后重定向到GET类型的List方法,避免空模型问题同时防止用户刷新页面重复提交删除请求:
[HttpPost] [Authorize] [ValidateAntiForgeryToken] public IActionResult List(int carId) { var Car = db.Cars.FirstOrDefault(x => x.Id == carId); // 增加空校验避免删除不存在的对象时报错 if (Car != null) { db.Cars.Remove(Car); db.SaveChanges(); } // 重定向到GET类型的List方法,自动加载最新的车辆列表数据 return RedirectToAction(nameof(List)); }
- 核对视图模型类名,确保GET方法中实例化的类名和定义的类名一致,避免类型不匹配问题。
- 可选优化:在视图的form标签中增加
asp-action="List"明确指定提交目标,避免路由匹配异常:
<form method="post" asp-action="List"> <input type="hidden" name="carId" value="@Model[i].CarId" /> <button type="submit" class="btn btn-danger btn-sm">Delete</button> </form>
内容的提问来源于stack exchange,提问作者warrior7
相关产品推荐
相关产品推荐

