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

使用RenderFragment<T>实现通用Razor基组件详情模板的语法疑问

通用Razor基组件中RenderFragment的正确实现方式

你的基类定义了泛型的RenderFragment<T>类型属性Detail,用于传递带上下文的渲染模板,但派生组件中的写法混淆了委托结构和属性语法,导致编译错误。

先修正基类的小错误

注意基类中存在两处笔误:Deatil应为Detail,</GridColumns缺少闭合的>,修正后的基类代码如下:

@typeparam T where T : class
....
<GridColumns>
  @Columns
</GridColumns>
....
<DetailTemplate>
   @Detail((T) context)
</DetailTemplate>

@code {
  protected abstract RenderFragment Columns { get; }
  protected abstract RenderFragment<T> Detail { get; } 
}

派生组件中Detail的正确实现

RenderFragment<T>本质是一个接受T类型参数并返回RenderFragment的委托,不需要额外嵌套get块或重复返回__builder => {...}。以下两种写法都可以:

写法一:完整属性getter

protected override RenderFragment<T> Detail
{
    get
    {
        return currentT => __builder =>
        {
            if (currentT.ParentId == null)
            {
                <h1>One</h1>
            }
            else
            {
                <h1>Two</h1>
            }
        };
    }
}

写法二:表达式体属性简化写法

protected override RenderFragment<T> Detail => currentT => __builder =>
{
    if (currentT.ParentId == null)
    {
        <h1>One</h1>
    }
    else
    {
        <h1>Two</h1>
    }
};

错误原因说明

你原来的写法错误地在表达式体内部添加了不必要的get块,并且重复返回了一个RenderFragment。RenderFragment<T>的结构是Func<T, RenderFragment>,只需要一层参数 => 渲染委托的结构即可,不需要额外的嵌套语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:25:27