ASP.NET Core 7 Razor Pages提交后空引用异常及成功消息显示问题
问题分析与解决方案
异常原因
提交表单触发OnPost方法后,你直接返回Page(),但此时不会自动执行OnGet方法,而userModel.Branches仅在OnGet中被赋值。视图渲染时遍历Model.userModel.Branches,因该集合未初始化导致NullReferenceException。数据插入成功是因为User对象的绑定和数据库操作不受影响,但页面所需的分支数据缺失。
修复方案
1. 重构PageModel:复用分支加载逻辑
将加载分支的代码抽成私有方法,在OnGet和OnPost(无论成功/失败)中调用,确保视图始终能获取到分支数据:
public class AddUserModel : PageModel { [BindProperty] public AddUserViewModel userModel { get; set; } [BindProperty] public UC.ADC.Core.Entities.SQL.User User { get; set; } public string SuccessMessage { get; set; } private readonly ADCContext _db; public AddUserModel(ADCContext db, OracleContext ora_db2) { _db = db; userModel = new AddUserViewModel(); } public void OnGet() { LoadBranches(); } public async Task<IActionResult> OnPost() { if (ModelState.IsValid) { await _db.User.AddAsync(User); await _db.SaveChangesAsync(); SuccessMessage = "表单提交成功!"; // 提交成功后重新加载分支数据 LoadBranches(); return Page(); } // ModelState验证失败时,同样加载分支保证视图正常渲染 LoadBranches(); return Page(); } // 抽离分支加载逻辑,避免代码重复 private void LoadBranches() { userModel.Branches = _db.Branch.ToList(); } }
2. 修改视图:添加成功消息显示
在视图顶部增加成功消息的渲染逻辑,同时确保表单标签闭合(原代码中</form缺少闭合符号>):
@page "/AddUser" @model AddUserModel <!-- 显示成功消息 --> @if (!string.IsNullOrEmpty(Model.SuccessMessage)) { <div class="alert alert-success">@Model.SuccessMessage</div> } <form method="post"> <div class="form-group row"> <label for="branch-select" class="col-sm-1 col-form-label" style="font-size:15px;font-family: 'Open Sans', sans-serif;font-weight: bold;">Branch</label> <div class="col-sm-3"> <select id="branch-select" asp-for="User.iBranchCode" class="form-control" style=" margin-left:10px;font-size:15px;font-family: 'Open Sans' , sans-serif;font-weight: bold;"> <option value="">-- Select Branch --</option> @foreach (var branch in Model.userModel.Branches) { <option value="@branch.iBranchCode">@branch.vBranchDesc</option> } </select> </div> </div> <div class="form-group row" style="margin-left:200px;font-size:15px;font-family: 'Open Sans' , sans-serif;font-weight: bold;"> <button type="submit" class="col-sm-1 btn btn-primary">Submit</button> </div> </form>
内容的提问来源于stack exchange,提问作者ahmed abdelaziz
相关产品推荐
相关产品推荐

