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
相关产品推荐
相关产品推荐

