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

.NET 8 Blazor SSR中如何区分页面首次加载与表单提交

解决Blazor组件提交后Model被数据库值覆盖的问题

你的核心问题是因为使用了Enhance特性,表单提交后组件会重新初始化,OnInitializedAsync再次执行时,原来通过vm.Title.Length == 0判断首次加载的逻辑不严谨(用户可能提交空标题),导致数据库中的旧值覆盖了用户提交的内容。

解决方案:添加初始化状态标记

新增一个私有布尔字段标记组件是否已完成首次数据加载,避免提交后重复从数据库读取数据覆盖用户输入:

<EditForm Model="@vm" OnSubmit="Submit" FormName="CommodityAddEdit"
          method="post" enctype="multipart/form-data" Enhance>

[SupplyParameterFromForm]
private AddEditCommodityVm vm { get; set; } = new();
// 标记是否已完成首次数据加载
private bool _hasInitializedData = false;

protected override async Task OnInitializedAsync()
{
    // 如果已经初始化过,直接返回
    if (_hasInitializedData) return;

    if (Id is not null) // 编辑模式
    {
        var commodity = await appDbContext.Commodities.FindAsync(Id);
        vm = commodity!.Adapt<AddEditCommodityVm>();
    }

    // 标记为已初始化
    _hasInitializedData = true;
}

public async Task Submit(EditContext editContext)
{
    if (Id == null)
        await Add(editContext);
    else
        await Update(editContext);
}

逻辑说明

  1. 组件首次加载时,_hasInitializedData为false,正常从数据库读取数据填充vm,之后将标记设为true。
  2. 表单提交后,组件重新初始化时,_hasInitializedData已经是true,直接跳过数据库读取逻辑,保留[SupplyParameterFromForm]绑定的用户提交值。

这种方法不受用户输入内容影响,是判断首次加载最可靠的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:04:57