Blazor删除函数已移除DB数据但前端HTML表格未更新问题求助
问题原因及修复方案
核心遗漏问题点
- 未修改前端绑定的数据源
lstCompanies:你只调用接口删除了后端数据库的对应数据,前端渲染表格用的lstCompanies集合没有删除对应条目,数据源不变的情况下调用StateHasChanged也不会触发视图更新。 - 异步方法未等待执行完成:
Http.PutAsJsonAsync和ItemUpdated.InvokeAsync都是异步方法,当前代码没有加await等待执行完成,后续逻辑会在接口请求还未结束时就提前触发,时序完全错乱,同时异步抛出的异常也无法被同步的try/catch捕获。 - 传给父组件的集合是未修改的旧数据:
ItemUpdated.InvokeAsync传入的是未做删除操作的原lstCompanies,父组件拿到的还是旧数据,也会导致父组件侧的视图不更新。
可选优化点
表格循环渲染的<tr>标签建议加上@key属性指定唯一值,帮助Blazor的差分渲染算法准确识别列表项变化,避免出现渲染异常,修改后的表格行代码如下:
<tr @key="Result.utpid"> <td>@Result.id</td> <td>@Result.companyName</td> <td> <button @onclick="() => RemoveCompanyFromList(Result)"> <i class="fa fa-trash-o fa-lg"></i> </button> </td> </tr>
修正后的删除函数代码
[Parameter] public EventCallback<List<Models.UTP>> ItemUpdated { get; set; } // 方法改为异步Task返回值,不要用async void避免异常丢失 private async Task RemoveCompanyFromList(Models.UTP utpResult) { string utpidResult = utpResult.utpid; try { // 等待删除接口请求完成 await Http.PutAsJsonAsync($"api/Users/company/remove/{utpidResult}", utpidResult); // 从前端绑定的集合中删除对应条目,这是视图更新的核心 lstCompanies.RemoveAll(x => x.utpid == utpidResult); // 传入修改后的集合给父组件,等待回调完成 await ItemUpdated.InvokeAsync(lstCompanies); // 异步方法执行完成后Blazor会自动触发状态更新,非特殊场景无需手动调用StateHasChanged // StateHasChanged(); } catch (Exception ex) { string exMsg = ex.Message; // 可在此处添加错误提示逻辑 } }
内容的提问来源于stack exchange,提问作者Shrey
相关产品推荐
相关产品推荐

