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

ASP.NET Core中Contract关联CarList空引用异常求助

解决ASP.NET Core MVC中Contract模型GesamtPreis属性的空引用异常问题

问题根源

空引用异常的核心原因是Contract的CarList导航属性未被加载(或加载失败)时,直接调用CarList.GesamtPreis()方法。以下是针对性的修复方案:


1. 给计算属性添加空引用防御

修改Contract模型的GesamtPreis属性,先检查CarList是否为null,避免直接调用方法:

public double GesamtPreis        
{
    get
    {
        // 若CarList为null,返回默认值0.0(可根据业务需求调整)
        return CarList?.GesamtPreis() ?? 0.0;
    }
}

2. 确保所有需要访问GesamtPreis的场景都加载CarList

控制器中部分方法未显式加载CarList导航属性,导致Contract对象的CarList为null:

修复Edit的GET方法

原方法使用FindAsync仅加载Contract本身,改为显式Include关联数据:

// GET: Contracts/Edit/5
public async Task<IActionResult> Edit(int? id)
{
    if (id == null || _context.Contract == null)
    {
        return NotFound();
    }

    // 显式加载CarList、CarGroup和Customer关联数据
    var contract = await _context.Contract
        .Include(c => c.CarList)
        .Include(c => c.CarList.CarGroup)
        .Include(c => c.Customer)
        .FirstOrDefaultAsync(m => m.Id == id);
    
    if (contract == null)
    {
        return NotFound();
    }

    // 以下下拉框代码保持不变...
}

3. 移除计算属性的表单绑定

GesamtPreis是计算属性,不需要从表单接收值,从Bind列表中移除,避免不必要的绑定错误:

修改Create的POST方法

[HttpPost]
[ValidateAntiForgeryToken]
// 移除Bind中的GesamtPreis
public async Task<IActionResult> Create(int id, [Bind("Id,CustomerId,CarListId,AusleihDatum,AbgabeDatum,KilometerstandAnfang,KilometerstandEnde")] Contract contract)
{
    // 方法内部代码保持不变...
}

修改Edit的POST方法

[HttpPost]
[ValidateAntiForgeryToken]
// 移除Bind中的GesamtPreis
public async Task<IActionResult> Edit(int id, [Bind("Id,CustomerId,CarListId,AusleihDatum,AbgabeDatum,KilometerstandAnfang,KilometerstandEnde")] Contract contract)
{
    // 方法内部代码保持不变...
}

额外注意事项

  • 所有需要在视图中显示GesamtPreis的控制器方法(如Index、Details、Delete),都要确保使用Include(c => c.CarList)加载关联数据;
  • 若CarList本身可能不存在(即CarListId对应的数据已被删除),除了属性层面的null检查,还可以在业务逻辑中提前校验数据完整性。

内容的提问来源于stack exchange,提问作者Miki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:40:55