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
相关产品推荐
相关产品推荐

