ASP.NET MVC嵌套列表实现问题:按类别展示家具表单遇空引用异常
解决按类别分组展示家具数量表单的NullReferenceException问题
你遇到的核心问题是控制器代码没有正确为每个FurnitureList对象的Furniture属性赋值,导致视图访问Model.Furniture时触发空引用异常。咱们一步步来修正这个问题:
问题根源分析
看你当前的控制器代码,存在两个关键逻辑错误:
- 所有家具的
QuantityList都被放到了全局的quantityListItems集合里,但没有和对应的类别FurnitureList建立关联 - 遍历每个家具项时,每次都新建
FurnitureList但只设置了CategoryID,完全没给Furniture属性赋值,视图访问时自然会是空引用
修正后的控制器代码
public IActionResult Furniture(int id) { FurnitureViewModel model = new FurnitureViewModel(); model.DeliveryID = id; // 补上原代码遗漏的DeliveryID赋值 // 预加载类别及关联的家具,优化查询避免N+1问题 var categories = context.FurnitureCategories .Include(c => c.Furniture) .ToList(); var furnitureGroups = new List<FurnitureList>(); foreach (var cat in categories) { // 为当前类别单独生成对应的QuantityList集合 var categoryFurnitureQuantities = cat.Furniture.Select(item => new QuantityList { ID = item.ID, Name = item.Name, Quantity = 0 }).ToList(); // 创建完整的FurnitureList对象,关联类别与对应家具数量项 furnitureGroups.Add(new FurnitureList { CategoryID = cat.ID, Furniture = categoryFurnitureQuantities // 关键:必须为Furniture属性赋值 }); } model.Categories = furnitureGroups; return View(model); }
关键修改点说明
- 预加载关联数据:用
Include(c => c.Furniture)一次性加载类别和对应的家具,既简化代码又避免多次查询数据库 - 按类别独立生成集合:每个类别单独创建自己的
QuantityList集合,保证数据分组的正确性 - 完整初始化FurnitureList:每个
FurnitureList对象都明确赋值Furniture属性,从根源避免空引用 - 补全DeliveryID赋值:原代码遗漏了
model.DeliveryID的赋值,这里补上避免后续业务逻辑出现问题
视图层验证建议
确保你的FurnitureList.cshtml视图正确遍历Model.Furniture,示例代码如下:
@model YourNamespace.FurnitureList <h3>类别ID:@Model.CategoryID</h3> @foreach (var item in Model.Furniture) { <div class="furniture-item"> <label>@item.Name</label> <input type="number" asp-for="@item.Quantity" min="0" /> <input type="hidden" asp-for="@item.ID" /> </div> }
这样修改后,每个类别分组都会正确加载对应的家具数量输入框,不会再触发空引用异常了。
内容的提问来源于stack exchange,提问作者user9633383
相关产品推荐
相关产品推荐

