You need to enable JavaScript to run this app. Blazor删除函数已移除DB数据但前端HTML表格未更新问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 07:18:02