Blazor中如何从子组件向父组件传List?编译正常但传值为null
Blazor子组件向父组件传递数组/ArrayList 解决null问题
核心问题排查(常见原因)
- 子组件未提前实例化数组/ArrayList,导致传递的是未初始化的null对象
- EventCallback未正确绑定或触发,父组件未接收到数据
- 误用普通参数传递,未使用Blazor官方推荐的回调机制
正确实现步骤
1. 子组件代码
定义EventCallback<T>类型参数用于数据传递,同时确保数组先完成实例化:
@code { // 声明向父组件传递数据的回调参数 [Parameter] public EventCallback<List<string>> OnDataPassed { get; set; } // 提前实例化集合,避免传递null private List<string> _childData = new List<string>(); // 触发数据传递的方法(可绑定按钮点击或其他事件) private async Task SendDataToParent() { // 给集合赋值示例 _childData.Clear(); _childData.Add("测试项1"); _childData.Add("测试项2"); // 触发回调,将数据传递给父组件 await OnDataPassed.InvokeAsync(_childData); } }
2. 父组件代码
绑定子组件的回调方法,接收并处理传递过来的数组:
<!-- 引用子组件并绑定回调方法 --> <ChildComponent OnDataPassed="HandleReceivedData" /> <p>父组件接收的数据:@string.Join(", ", _parentData)</p> @code { private List<string> _parentData = new List<string>(); // 处理子组件传递的数据 private void HandleReceivedData(List<string> data) { if (data != null) { _parentData = data; StateHasChanged(); // 必要时手动刷新UI } } }
针对ArrayList的适配(建议优先用泛型集合)
如果必须使用ArrayList,只需将上述代码中的List<string>替换为ArrayList即可:
子组件示例:
[Parameter] public EventCallback<ArrayList> OnDataPassed { get; set; } private ArrayList _childData = new ArrayList();
父组件同步调整接收数据的类型即可。
关键错误修正点
- 必须提前用
new实例化集合对象,禁止传递未初始化的变量 - 确保父组件正确绑定子组件的
EventCallback参数,不要遗漏赋值 - 避免在组件未完成渲染的生命周期阶段传递数据(比如
OnInitialized早期),建议在用户交互事件或OnAfterRenderAsync中触发传递
内容的提问来源于stack exchange,提问作者Mert
相关产品推荐
相关产品推荐

