ASP.NET Core Razor页面提交分类至数据库时出现空引用异常
ASP.NET Core Razor页面添加分类时NullReferenceException排查与解决
核心原因定位
报错的NullReferenceException是因为Add.cshtml第71行代码尝试访问一个null对象的成员,比如分类集合、ViewModel实例本身为null,导致无法正常读取属性或执行循环/绑定操作。
分步排查与修复方案
1. 检查AddEditProductVM的属性初始化
如果ViewModel中包含分类相关集合属性,必须确保集合在实例化时被初始化,避免页面绑定时空引用:
public class AddEditProductVM { public int Id { get; set; } public string ProductName { get; set; } // 选中的分类ID public int SelectedCategoryId { get; set; } // 分类列表 public List<Category> Categories { get; set; } // 构造函数初始化集合,避免null public AddEditProductVM() { Categories = new List<Category>(); } }
2. 修正Add.cshtml.cs的ViewModel加载逻辑
在页面OnGet方法中,必须实例化ViewModel并加载分类数据,确保页面渲染时Model不为null;同时在OnPost验证失败时,重新加载分类列表,避免返回页面时出现空引用:
public class AddModel : PageModel { private readonly YourDbContext _dbContext; public AddModel(YourDbContext dbContext) { _dbContext = dbContext; } [BindProperty] public AddEditProductVM ProductVM { get; set; } public IActionResult OnGet() { // 初始化ViewModel并加载分类 ProductVM = new AddEditProductVM(); ProductVM.Categories = _dbContext.Categories.ToList(); return Page(); } public async Task<IActionResult> OnPostAsync() { if (!ModelState.IsValid) { // 验证失败时重新加载分类,防止页面报错 ProductVM.Categories = _dbContext.Categories.ToList(); return Page(); } // 处理商品添加逻辑,关联选中的分类 var product = new Product { Name = ProductVM.ProductName, CategoryId = ProductVM.SelectedCategoryId }; _dbContext.Products.Add(product); await _dbContext.SaveChangesAsync(); return RedirectToPage("./Index"); } }
3. 修复Add.cshtml第71行的空引用问题
假设第71行是分类下拉框绑定代码,添加null判断避免访问空对象:
<!-- 原报错代码(示例):@Html.DropDownListFor(m => m.SelectedCategoryId, new SelectList(Model.Categories, "Id", "Name")) --> <!-- 修正后代码 --> <div class="form-group"> <label asp-for="ProductVM.SelectedCategoryId" class="control-label">商品分类</label> @if (ProductVM?.Categories != null && ProductVM.Categories.Any()) { <select asp-for="ProductVM.SelectedCategoryId" asp-items="@(new SelectList(ProductVM.Categories, "Id", "Name"))" class="form-control"> <option value="">请选择分类</option> </select> } else { <span class="text-warning">暂无可用分类,请先添加分类</span> } <span asp-validation-for="ProductVM.SelectedCategoryId" class="text-danger"></span> </div>
内容的提问来源于stack exchange,提问作者naime khoshnod
相关产品推荐
相关产品推荐

