ASP.NET MVC中Index视图Model.get返回NullReferenceException问题
问题分析与解决方案
你遇到的NullReferenceException核心原因是Index视图接收到的Model为null,直接访问@Model.Name这类属性时触发了空引用错误。下面是具体问题点和修复步骤:
问题根源拆解
- 控制器返回视图时未传递模型:比如
Index方法中ModelState无效时,直接返回return View();,没有把catDetails实例传给视图,导致视图的@Model为null。 - 视图未做空值校验:直接访问
@Model的属性,没有判断模型是否存在。 - Create的Post方法未做验证:直接把可能无效的模型传给Index视图,跳过了校验逻辑。
具体修复步骤
1. 给Index视图增加空值判断
修改视图代码,先检查模型是否存在,再渲染内容:
@model Cat @{ ViewData["Title"] = "Index"; } <h2>Cat</h2> @if (Model != null) { <table class="table table-sm table-bordered table-striped"> <tr><th>name:</th><td>@Model.Name</td></tr> <tr><th>Age:</th><td>@Model.Age</td></tr> <tr><th>Colouring:</th><td>@Model.Colouring</td></tr> <tr><th>KidFriendly:</th><td>@Model.KidFriendly</td></tr> <tr><th>Personality:</th><td>@Model.Personality</td></tr> </table> } else { <p>暂无猫咪领养信息</p> }
2. 修复控制器的Index方法
确保返回视图时始终传递模型实例,避免@Model为null:
public IActionResult Index(Cat catDetails) { // 自定义验证逻辑(补充DataAnnotations未覆盖的规则) if (catDetails.Id < 0) ModelState.AddModelError(nameof(catDetails.Id), "Id不能小于0"); if (catDetails.Age < 1 || catDetails.Age > 20) ModelState.AddModelError(nameof(catDetails.Age), "年龄必须在1-20之间"); if (ModelState.IsValid) return View(catDetails); else // 必须传递模型,否则视图接收不到实例 return View(catDetails); }
3. 优化Create的Post方法
增加模型验证,无效时返回表单页面,有效再跳转到Index:
[HttpPost] public IActionResult Create(Cat model) { // 利用模型的DataAnnotations自动验证,无需手动重复判断 if (ModelState.IsValid) { // 可在此处将模型保存到repository repository.AddCat(model); return View("Index", model); } else { // 验证失败,返回表单页面并显示错误 return View(model); } }
4. 简化模型验证逻辑
你的Cat模型已经通过[Required]等特性标记了校验规则,ASP.NET Core会自动完成基础验证,不需要在控制器里重复写string.IsNullOrEmpty这类判断,只需要保留自定义的规则(比如年龄范围)即可。
额外说明:你猜测的Colouring下拉框空值问题,只会导致Model.Colouring为null,不会让Model本身为null,所以不是触发本次错误的原因。
内容的提问来源于stack exchange,提问作者Síofra
相关产品推荐
相关产品推荐

