ASP.NET Core Razor Page新建列表项时触发System.NullReferenceException问题
问题解决办法
空引用异常触发的核心原因如下:
- Razor页面加载时,
CreateModel的Items属性未初始化,访问@Model.Items直接触发空引用 - 即使
Items初始化,其导航属性Groups也未实例化,访问@Model.Items.Groups.Id会二次触发空引用 - 若
g_Mrthod.GetAllGroups()返回null,下拉框绑定asp-items也会抛出空引用异常
修复步骤
第一步:调整实体类,增加外键字段(推荐)
不直接绑定导航属性的子字段,增加显式外键更符合EF Core开发规范,也能从根源避免导航属性为空带来的绑定问题:
public class Items_Class { public int Id { get; set; } public string ItemName { get; set; } public decimal ItemPrice { get; set; } public decimal ItemQuantity { get; set; } // 新增显式外键字段,EF Core会自动识别为Groups导航属性的外键 public int GroupId { get; set; } public Groups_Class Groups { get; set; } }
第二步:初始化PageModel的绑定属性
在OnGet方法中初始化所有页面需要用到的属性,避免空值:
public void OnGet() { // 处理分组列表为空的情况,默认赋值空列表避免下拉框绑定报错 AllGroup = g_Mrthod.GetAllGroups() ?? new List<Groups_Class>(); // 初始化绑定的Items对象和关联的Groups导航属性 Items = new Items_Class { Groups = new Groups_Class() }; }
第三步:调整视图绑定逻辑
下拉框直接绑定新增的GroupId字段,不需要再访问导航属性的子字段:
<input asp-for="@Model.Items.Id" /> <label asp-for="@Model.Items.GroupId">Group name</label> <select asp-for="@Model.Items.GroupId" asp-items="@(new SelectList(Model.AllGroup,"Id","GroupName" ))"></select>
如果不想修改实体类新增外键字段,仅完成第二步的属性初始化操作,原有视图绑定代码也可以正常运行,不会触发空引用异常。
内容的提问来源于stack exchange,提问作者Ahmed Essa
相关产品推荐
相关产品推荐

