You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套对象绑定下拉列表失败:Object reference not set空引用异常

问题分析与解决方案

核心问题原因

  1. 空引用异常根源:创建的NCR实例中,QualityRepresentative属性未初始化(默认值为null),视图尝试访问QualityRepresentative.ProblemID时,因引用对象为空触发异常。
  2. ViewData/ViewBag键不匹配:控制器中存入ViewData["QualityRepresentative.ProblemID"],但视图调用asp-items="ViewBag.ProblemID",键名不一致导致下拉列表无数据。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:45:57