ASP.NET MVC Create视图枚举第二模型数据出现NullReferenceError解决方案
问题根因
你遇到的空引用错误完全是控制器没有给视图传递有效模型导致的:
- GET请求的
Create方法直接调用return View(),没有传入实例化的Software对象,视图渲染时Model本身就是null,访问Model.Departments这类属性自然触发空引用。 - 就算你给空枚举加了判断能加载页面,下拉菜单也没有选项,完全达不到功能要求。
- 另外POST请求如果模型校验失败返回视图时,你同样没有填充下拉需要的集合数据,后续提交报错后还是会触发同样的空引用问题。
修复步骤
1. 调整控制器的Create方法
修改GET和POST的两个Create方法,主动从数据库查询下拉需要的三类数据,赋值给Software对象后再传给视图:
public IActionResult Create() { var software = new Software { Departments = _context.Departments.ToList(), Vendors = _context.Vendors.ToList(), Suppliers = _context.Suppliers.ToList() }; return View(software); } [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("SOFT_ID,SOFT_NAME,IT_CONTACT,SOFT_EXP_DATE,SOFT_SUP_PERIOD,SOFT_OUT_OF_SERVICE,SOFT_IS_RENEWED,DEPT_ID,VEND_ID,SUPP_ID")] Software software) { if (ModelState.IsValid) { _context.Add(software); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } // 校验失败时也要重新填充下拉数据,不然返回页面还是会报错 software.Departments = _context.Departments.ToList(); software.Vendors = _context.Vendors.ToList(); software.Suppliers = _context.Suppliers.ToList(); return View(software); }
2. 优化模型设计(可选但强烈建议)
你当前的模型设计有不规范的地方,容易触发绑定问题:导航属性不应该用ID后缀命名,建议拆分外键字段和导航属性,修改Software类对应部分:
// 新增外键字段 public int DEPT_ID { get; set; } public int VEND_ID { get; set; } public int SUPP_ID { get; set; } // 导航属性改名,不要和外键重名 [Required] public virtual Department Department { get; set; } [Required] public virtual Vendor Vendor { get; set; } [Required] public virtual Supplier Supplier { get; set; }
修改后视图里的下拉框要加上asp-for绑定对应外键字段,才能正常提交选中的值:
<select asp-for="DEPT_ID" class="form-control"> <option value="" disabled selected>Select A Dept</option> @foreach (var item in Model.Departments) { <option value="@item.DEPT_ID">@item.DEPT_NAME</option> } </select>
剩下两个供应商、厂商的下拉也按照同样规则修改即可。
内容的提问来源于stack exchange,提问作者dtohok2021
相关产品推荐
相关产品推荐

