如何有条件地添加 Blazor 组件的模板?

Ven*_*sky 3 c# blazor asp.net-blazor

我正在使用接收模板的第三方 blazor 组件,但我正在为该组件制作一个包装器,该包装器也将具有模板属性。

如果有人将我的包装器与模板一起使用,它应该传递模板,但如果没有,它应该使用组件的默认模板。

我尝试的是添加一个 if,但它不起作用

@if (ItemTemplate != null)
    <ItemTemplate Context="Data">
            @ItemTemplate(Data)        
    </ItemTemplate>
}
Run Code Online (Sandbox Code Playgroud)

它给了我一个错误

组件“TelerikDropDownList”中无法识别的子内容。组件“TelerikDropDownList”通过以下顶级项目接受子内容:“ValueTemplate”、“HeaderTemplate”、“FooterTemplate”、“ItemTemplate”

但是如果我添加它里面的 If ItemTemplate

<ItemTemplate Context="Data">
    @if (ItemTemplate != null)
    {
        @ItemTemplate(Data)
    }
</ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

它不会渲染任何东西,因为模板内容是空的。

如何ItemTemplate有条件地添加或使用组件的默认值ItemTemplate

观察:我正在使用 Telerik,但是这个问题对于任何带有模板的组件都应该是通用的

Art*_*tak 5

考虑将检查移出组件声明。这是一个例子。假设您有两个组件:InnerComponentWrapperComponent。您的代码在 WrapperComponent 中应如下所示:

@if(CustomTemplate == null)
{
   <InnerComponent />
}
else
{
    <InnerComponent>
        <ItemTemplate>@ItemTemplate</ItemTemplate>
    </InnerComponent>
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我有一个非常大的组件,我将需要复制 if 和 else 中的所有逻辑,唯一的区别是模板吗?我认为这不好。另外,如果您有多个 blazor 模板,您将有多个 if else if 语句,并且会非常复杂 (2认同)
  • 或者,您可以在代码中执行此操作 - 将实际的“ItemTemplate”属性分配给代码中的值。这将使标记保持干净 (2认同)