嵌套对象绑定下拉列表失败:Object reference not set空引用异常
问题分析与解决方案
核心问题原因
- 空引用异常根源:创建的
NCR实例中,QualityRepresentative属性未初始化(默认值为null),视图尝试访问QualityRepresentative.ProblemID时,因引用对象为空触发异常。 - ViewData/ViewBag键不匹配:控制器中存入
ViewData["QualityRepresentative.ProblemID"],但视图调用asp-items="ViewBag.ProblemID",键名不一致导致下拉列表无数据。 - SelectList显示字段错误:
Problem模型中没有ProblemID属性,创建SelectList时指定的显示字段错误,应使用ProblemDescription。
修复步骤及代码修改
1. 控制器代码修改
初始化NCR实例时同时实例化QualityRepresentative属性,修正SelectList显示字段并统一ViewData键名:
// GET: NCR/CreateQualityRepresentative public async Task<IActionResult> CreateQualityRepresentative() { // 初始化NCR时同时实例化QualityRepresentative,避免空引用 NCR genNCR = new NCR() { QualityRepresentative = new QualityRepresentative() }; NCRNumber createNCRNumber = new NCRNumber(); // 修正SelectList的显示字段为ProblemDescription,统一ViewData键名为ProblemID ViewData["ProblemID"] = new SelectList(_context.Problems, "ID", "ProblemDescription"); //Create next NCR number logic NCRNumber lastNCRNum = await _context.NCRNumbers .OrderByDescending(n => n.ID) .FirstOrDefaultAsync(); createNCRNumber.Year = DateTime.Now.Date.Year; bool isNewYear = false; // Logic to decide if it is a new year and the counter should be set to 0 if (lastNCRNum != null) { if (lastNCRNum.Year != DateTime.Now.Date.Year) { isNewYear = true; genNCR.NCRNum = createNCRNumber.GenerateNCRNumber(isNewYear); _context.NCRNumbers.Add(createNCRNumber); return View("Create", genNCR); } genNCR.NCRNum = createNCRNumber.GenerateNCRNumber(isNewYear); _context.NCRNumbers.Add(createNCRNumber); await _context.SaveChangesAsync(); return View("Create", genNCR); } genNCR.NCRNum = createNCRNumber.GenerateNCRNumber(isNewYear); _context.NCRNumbers.Add(createNCRNumber); await _context.SaveChangesAsync(); return View("Create", genNCR); }
2. 视图代码修改
让asp-items的键名与控制器中的ViewData保持一致:
<select asp-for="QualityRepresentative.ProblemID" class="form-control" asp-items="@ViewData["ProblemID"]"></select>
3. 额外验证(可选)
ASP.NET Core默认支持嵌套属性绑定,asp-for生成的字段名称为QualityRepresentative.ProblemID,后台POST方法可直接正确接收该值,无需额外配置。
内容的提问来源于stack exchange,提问作者Iago Romao
相关产品推荐
相关产品推荐

