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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:10:01