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

Blazor中如何将子组件对象传回父组件?级联参数使用疑问

Blazor级联参数修改后父组件对象为空的问题解决

你当前的使用方式存在核心问题:Blazor的级联参数默认是单向传递机制,当子组件直接替换整个对象实例时,父组件的引用不会自动同步。

原因分析

  • AddressDTO是引用类型,若在子组件中修改SelectedAddress的内部属性(比如SelectedAddress.Street = "新地址"),父组件的对象会同步更新——因为两者指向同一个实例。
  • 但如果子组件执行SelectedAddress = new AddressDTO(),这是给子组件的局部变量重新赋值了新实例,父组件的SelectedAddress仍指向原引用,不会随之改变。切换回父组件时,自然看不到子组件新创建的对象。

解决方法

方法一:修改对象内部属性(推荐,适合无需替换整个对象的场景)

不要给SelectedAddress赋值新对象,直接修改现有实例的属性:

// 子组件中修改属性,而非替换对象
if (SelectedAddress != null)
{
    SelectedAddress.City = "北京";
    SelectedAddress.Street = "某某街道123号";
}

父组件的SelectedAddress会同步更新,因为两者引用同一个实例。

方法二:通过回调通知父组件更新对象(适合需要替换整个对象的场景)

若必须创建新的AddressDTO实例,需让父组件自行更新对象引用:

  1. 父组件后台代码:
public AddressDTO SelectedAddress { get; set; } = new AddressDTO();

// 定义更新地址的方法
public void UpdateAddress(AddressDTO newAddress)
{
    SelectedAddress = newAddress;
}
  1. 父组件前台:
    将更新方法也通过级联参数传递给子组件:
<CascadingValue Value="SelectedAddress">
    <CascadingValue Value="UpdateAddress">
        <CollectionAddress VendorNumber="@VendorNumber"></CollectionAddress>
    </CascadingValue>
</CascadingValue>
  1. 子组件后台代码:
    接收更新方法,在需要替换对象时调用:
[CascadingParameter] protected AddressDTO? SelectedAddress { get; set; }
[CascadingParameter] protected Action<AddressDTO>? UpdateAddress { get; set; }

// 替换对象时调用父组件的更新方法
var newAddress = new AddressDTO { City = "上海", Street = "外滩路456号" };
UpdateAddress?.Invoke(newAddress);

方法三:使用EventCallback(符合Blazor组件交互规范,支持异步场景)

用EventCallback替代普通Action,适配异步逻辑:

  1. 父组件后台:
public AddressDTO SelectedAddress { get; set; } = new AddressDTO();

public async Task OnAddressUpdated(AddressDTO newAddress)
{
    SelectedAddress = newAddress;
    // 可添加其他异步逻辑
}
  1. 父组件前台:
    直接通过组件参数传递回调(也可用级联参数):
<CascadingValue Value="SelectedAddress">
    <CollectionAddress VendorNumber="@VendorNumber" OnAddressUpdated="@OnAddressUpdated"></CollectionAddress>
</CascadingValue>
  1. 子组件后台:
[CascadingParameter] protected AddressDTO? SelectedAddress { get; set; }
[Parameter] public EventCallback<AddressDTO> OnAddressUpdated { get; set; }

// 调用回调更新父组件对象
var newAddress = new AddressDTO { ... };
await OnAddressUpdated.InvokeAsync(newAddress);

总结

  • 级联参数本身不支持双向绑定,引用类型的属性修改会自动同步,但替换整个实例必须通过回调让父组件更新。
  • 优先选择修改对象内部属性的方式,逻辑更简洁;若需替换实例,用回调或EventCallback通知父组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:41:13