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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:17:09