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

C# RazorPage:通过模态弹窗添加记录时触发NullReferenceException

解决Razor Page模态弹窗提交后NullReferenceException问题

问题原因

当表单提交触发OnPostCreateAsync方法时,若ModelState.IsValid验证不通过(比如输入不符合规则),方法会返回Page(),但此时未重新加载Brand列表数据,导致页面模型的Brand属性为null。前端页面中@Html.DisplayNameFor(model => model.Brand[0].BrandName)和@foreach (var item in Model.Brand)都会因Brand为null触发空引用异常。

解决方案

1. 修复后台Post方法

在返回Page()前重新加载品牌列表,确保页面渲染时有可用数据:

public async Task<IActionResult> OnPostCreateAsync(string BrandName)
{
    // 先加载品牌列表,避免页面空引用
    Brand = await _context.Brands.ToListAsync();

    if (!ModelState.IsValid)
    {
        return Page();
    }

    var brand = new Brand { BrandName = BrandName };
    _context.Brands.Add(brand);
    await _context.SaveChangesAsync();

    return RedirectToPage("./Index");
}

2. 优化前端DisplayNameFor代码

直接访问Brand[0]存在空列表风险,改用更安全的表达式:

<th>
    @Html.DisplayNameFor(model => model.Brand.FirstOrDefault()!.BrandName)
</th>

或者直接绑定实体类型属性(无需依赖列表数据):

<th>
    @Html.DisplayNameFor(model => new Brand().BrandName)
</th>

3. 前端表格循环增加空判断

避免列表为空时的异常,添加空值检查:

<tbody>
@if (Model.Brand != null && Model.Brand.Any())
{
    foreach (var item in Model.Brand) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.BrandName)
            </td>
            <td>
                <a asp-page="./Edit" asp-route-id="@item.BrandID">Edit</a> |
                <a asp-page="./Details" asp-route-id="@item.BrandID">Details</a> |
                <a asp-page="./Delete" asp-route-id="@item.BrandID">Delete</a>
            </td>
        </tr>
    }
}
else
{
    <tr>
        <td colspan="2">暂无品牌数据</td>
    </tr>
}
</tbody>

可选:用TagHelper规范表单绑定(推荐)

在PageModel中添加绑定属性:

[BindProperty]
public string NewBrandName { get; set; } = string.Empty;

修改表单输入框:

<input class="form-control" required="required" asp-for="NewBrandName" />

调整Post方法参数:

public async Task<IActionResult> OnPostCreateAsync()
{
    Brand = await _context.Brands.ToListAsync();

    if (!ModelState.IsValid)
    {
        return Page();
    }

    var brand = new Brand { BrandName = NewBrandName };
    _context.Brands.Add(brand);
    await _context.SaveChangesAsync();

    return RedirectToPage("./Index");
}

内容的提问来源于stack exchange,提问作者user2058897

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:35:38