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

Blazor中如何引用循环动态生成的Razor类库自定义控件实例

Blazor动态生成自定义控件的引用方案

方法1:通过@ref收集控件实例(直接满足需求)

这种方式可以直接拿到所有渲染完成的自定义控件实例,步骤如下:

  • 在父页面定义一个存储控件引用的泛型列表,类型对应你的自定义控件类
  • 在循环渲染控件时,通过@ref特性将每个渲染完成的控件实例添加到列表中
  • 需要调用控件方法时,直接遍历该列表即可

代码示例

父页面Razor部分:

<div class="col-12">
    @foreach (MyModel new_control_model in p.list_of_control_models)
    {
       <myCustomControl model="new_control_model" @ref="AddControlToCache" />
   }
</div>

父页面@code部分:

@code{
    // 存储所有动态生成的控件引用
    private List<myCustomControl> _controlCache = new();

    // 控件渲染完成后自动调用该方法,将实例加入缓存
    private void AddControlToCache(myCustomControl control)
    {
        if (control != null && !_controlCache.Contains(control))
        {
            _controlCache.Add(control);
        }
    }

    private void GetValues()
    {
        // 直接遍历缓存列表调用控件公开方法
        foreach(var control in _controlCache)
        {
            control.YourPublicMethod();
        }
    }

    // 若存在动态删除控件的场景,需补充引用清理逻辑:
    // 1. 自定义控件实现IDisposable接口,销毁时通知父页从_controlCache移除自身
    // 2. 或在删除对应Model的同时清空_controlCache,重新渲染时会自动重建缓存
}

方法2:状态驱动模式(更符合Blazor设计思想,推荐优先使用)

Blazor是状态优先的框架,多数场景下不需要直接持有控件实例:

  • 你需要调用控件方法获取的内容,都可以绑定到对应的MyModel属性上
  • 控件内部值变化时同步更新绑定的Model实例
  • 需要获取所有控件值时,直接遍历p.list_of_control_models即可,不需要操作控件本身

这种方式完全不需要处理引用生命周期,不会出现无效引用、内存泄漏等问题,耦合度更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:45:03