.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); }
逻辑说明
- 组件首次加载时,
_hasInitializedData为false,正常从数据库读取数据填充vm,之后将标记设为true。 - 表单提交后,组件重新初始化时,
_hasInitializedData已经是true,直接跳过数据库读取逻辑,保留[SupplyParameterFromForm]绑定的用户提交值。
这种方法不受用户输入内容影响,是判断首次加载最可靠的方式。
内容的提问来源于stack exchange,提问作者Mohammad Komaei
相关产品推荐
相关产品推荐

