使用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
相关产品推荐
相关产品推荐

