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

Blazor组件传值异常:OnInitializedAsync无法获取正确ID值

问题原因

你的问题核心是组件生命周期执行时机与参数更新逻辑不匹配:

  • OnInitializedAsync 仅在组件第一次初始化时执行一次。如果父组件中 warehouseShipment.ShipId 是异步加载(比如从数据库/API获取),组件初始化时id还是默认值0,此时test被设为"Fail"。
  • 后续父组件数据加载完成,id更新为3,但OnInitializedAsync不会再次执行,test保持"Fail";而HTML部分会实时绑定最新的id值,因此出现"Fail3"的结果。

解决方案

方案1:改用OnParametersSetAsync处理参数更新

OnParametersSetAsync会在组件初始化以及每次参数变化时执行,适配参数动态更新的场景:

修改TestComponent的@code部分:

protected override async Task OnParametersSetAsync()
{
    // 可选:添加判断避免重复执行数据库操作(仅在id有效且未加载过时执行)
    if (id != 0 && test != "Success")
    {
        test = "Success";
        // 在这里执行数据库查询逻辑,例如:
        // var data = await _dbContext.Inventories.FindAsync(id);
    }
    else if (id == 0)
    {
        test = "Fail";
    }
}

方案2:确保父组件数据就绪后再渲染子组件

如果warehouseShipment是异步加载的,在父组件中先判断数据是否完成加载,再渲染TestComponent,这样组件初始化时就能拿到正确的id:

修改父页面代码:

<div>
    @if (warehouseShipment != null)
    {
        <TestComponent @ref="_windowComp" id="@warehouseShipment.ShipId" />
    }
    <button @onclick="@(()=> _windowComp?.Show())" class="btn btn-success btn-label btn-sm waves-effect waves-light">
        <i class="ri-briefcase-5-line label-icon align-middle fs-16 me-2"></i>Reserve Inventory
    </button> &nbsp;&nbsp; 
</div>

这种方式下,组件第一次初始化时id就是正确的有效值,OnInitializedAsync中能直接拿到目标值执行数据库操作。


补充说明
  • 若数据库操作仅需执行一次,优先选择方案2,或在方案1中添加判断条件避免重复执行。
  • 使用@ref时,若子组件是条件渲染,调用组件方法(如Show())需加空引用判断(如_windowComp?.Show()),避免报错。

内容的提问来源于stack exchange,提问作者Big Cat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:53:12