【问题标题】:Render blazor components dynamically from a factory从工厂动态渲染 Blazor 组件
【发布时间】:2021-03-18 10:38:41
【问题描述】:

我有一个IList<IControl>,它是一个派生自IComponent 的接口,该接口的每个实现都继承自ComponentBase。该组件是从工厂动态实例化的(它返回一个与输入类型兼容的组件)。

现在我想渲染这个列表,但我不知道怎么做,这是我的 ControlsContainer.razor:

@foreach (var control in OrderedControls)
{
    <div @key=@Guid.NewGuid().ToString()>

        @RenderWidget(control)

    </div>
}

如果每个组件类型(它们通过反射动态加载,我不需要在某处注册它们),我想避免 switch/if-else。

【问题讨论】:

  • 所以如果我没看错的话,你有一个具体的列表IList&lt;IControl&gt; 你在工厂中创建的具体组件的实例——比如表单的输入控件。您想要做的是将它们添加到带有“工厂”控件的页面中吗?是/否?在提出解决方案之前,我正在尝试了解问题。
  • 旁注,但@key=... 部分非常错误。

标签: c# blazor blazor-webassembly


【解决方案1】:

未经测试,但以下应该可以工作,或者至少让你走上正确的道路......

@foreach (var control in OrderedControls)
{
    <div @key=@Guid.NewGuid().ToString()>

        @RenderWidget(control)

    </div>
}

@code {
    RenderFragment RenderWidget(IControl control)
    {
        var concreteType = control.GetType();
        RenderFragment frag = new RenderFragment(b =>
        {
            b.OpenComponent(1, concreteType);
            b.CloseComponent();
        });
        return frag;
    }
}

【讨论】:

  • 非常感谢,但这会创建IControl 具体类型的新实例。我创建了一个临时方法,它通过反射调用私有类型并获取组件的 RenderFragment。我不喜欢这种解决方案,但我认为这是 blazor 的限制之一。
  • 啊,我明白了。那么,您想要保留 Razor 组件的具体引用并按需使用它们吗?我很好奇你的用例是什么。我假设之前对组件的操作已经建立了一些您想要在“组件内”维护但在不同位置重用组件的状态?
猜你喜欢
  • 2021-10-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多