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

Blazor中如何用单个Razor组件渲染不同子类的基类属性?

实现方案

你可以通过泛型Blazor组件来实现这个需求,让ListComponent兼容所有继承自DomainModel的子类列表,具体步骤如下:

1. 创建泛型ListComponent组件

在ListComponent.razor中定义泛型类型参数,并约束为DomainModel的派生类,同时添加接收列表数据的参数:

@typeparam T where T : DomainModel

@if (Items != null)
{
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>名称</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Items)
            {
                <tr>
                    <td>@item.Id</td>
                    <td>@item.Name</td>
                </tr>
            }
        </tbody>
    </table>
}

@code {
    [Parameter, Required]
    public List<T>? Items { get; set; }
}

2. 在页面中使用泛型组件

在PageClass1.razor和PageClass2.razor中,指定泛型参数并传递对应的列表:

PageClass1.razor

@page "/class1"

@code {
    private List<Class1> list1 = new()
    {
        new Class1 { Id = 1, Name = "Class1示例1", AnotherText1 = "额外文本1" },
        new Class1 { Id = 2, Name = "Class1示例2", AnotherText1 = "额外文本2" }
    };
}

<ListComponent T="Class1" Items="list1" />

PageClass2.razor

@page "/class2"

@code {
    private List<Class2> list2 = new()
    {
        new Class2 { Id = 1, Name = "Class2示例1", AnotherText2 = "额外文本A" },
        new Class2 { Id = 2, Name = "Class2示例2", AnotherText2 = "额外文本B" }
    };
}

<ListComponent T="Class2" Items="list2" />

这样ListComponent就能统一渲染所有DomainModel子类的公共属性(Id和Name),同时保持对不同子类列表的兼容性。如果后续需要渲染子类特有的属性,还可以通过添加模板参数(比如RenderFragment<T>)来扩展,让调用页面自定义子类属性的渲染逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:18:17