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

MVC视图遍历复合模型的Classes时遇NullReferenceException求助

问题描述

我创建了一个包含两个子模型的复合模型,代码如下:

public IEnumerable<Character> Characters { get; set; }
public IEnumerable<Class>? Classes { get; set; }

当我尝试在视图中通过foreach遍历Model.Classes并显示其名称时,代码如下:

@foreach (var item in Model.Classes)
{
    <label><input asp-for="Character.Classes" value="item.Name" type="radio" />item.Name</label>
}

出现错误:

NullReferenceException: Object reference not set to an instance of an object.

这是我首次使用MVC开发网站,已尝试扩展方法转空集合、空值判断、??运算符等方式,但仍未解决,不确定是否因Classes有时为null导致,恳请帮助。


解决方案

1. 解决空引用核心问题

你的判断正确,Classes是可空的IEnumerable<Class>?,当它为null时直接遍历会触发NullReferenceException。以下是几种可靠的修复方式:

方式一:视图内用null合并运算符生成空集合

修改遍历语句,确保即使Classes为null也能遍历空集合:

@foreach (var item in Model.Classes ?? Enumerable.Empty<Class>())
{
    <label><input asp-for="Character.Classes" value="@item.Name" type="radio" />@item.Name</label>
}

方式二:控制器初始化时避免null

在控制器传递模型到视图前,提前给Classes赋值空集合,从源头杜绝null:

// 控制器动作方法示例
var compositeModel = new YourCompositeModel();
// 若Classes为null则赋值空集合
compositeModel.Classes = compositeModel.Classes ?? Enumerable.Empty<Class>();
return View(compositeModel);

方式三:空条件运算符结合ToList()(C# 6.0+)

@foreach (var item in Model.Classes?.ToList() ?? new List<Class>())
{
    <label><input asp-for="Character.Classes" value="@item.Name" type="radio" />@item.Name</label>
}

2. 视图代码的额外修正

除了空引用问题,你的视图还有两处错误需要调整:

  • item.Name必须加@前缀才能输出变量值,否则会直接显示字符串"item.Name"
  • asp-for="Character.Classes"的绑定路径可能不符合业务逻辑:你的复合模型中Characters是集合,单选按钮通常绑定到单个Character的属性而非集合,需要根据实际需求调整绑定目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:30:07