如何使用?要么 ??有条件地呈现 Blazor 模板?

How to use either ?. or ?? to conditionally render Blazor template?

我想简化以下内容

@if (Template != null)
{
    @Template
}
else
{
    <span>No contents!</span>
}

???.

可能吗?

尝试

以下是我的尝试

生成红色波浪线。

编辑

我想我需要提交我想简化的真实场景。

@typeparam T

@if (Items == null)
{
    if (NullTemplate != null)
    {
        @NullTemplate
    }
    else
    {
        <span style="color: red">Null...</span>
    }
}
else if (Items.Count == 0)
{
    if (EmptyTemplate != null)
    {
        @EmptyTemplate
    }
    else
    {
        <span style="color: red">Empty ...</span>
    }
}
else
{
    @HeaderTemplate

    foreach (T item in Items)
    {

        @ItemTemplate(item)
    }
}

    
@code{
    [Parameter] public RenderFragment NullTemplate { get; set; }
    [Parameter] public RenderFragment EmptyTemplate { get; set; }
    [Parameter] public RenderFragment HeaderTemplate { get; set; }
    [Parameter] public RenderFragment<T> ItemTemplate { get; set; }
    [Parameter] public List<T> Items { get; set; }
}

我不想将传入值缓冲到具有私有字段的 ****Template 属性,在将它们(字段)渲染到 HTML 之前预处理这些字段。换句话说,不允许在 @code{} 指令中添加其他代码。

当您将 <span style="color: red">Null...</span> 部分存储为 RenderFragment 时,它可能会起作用(我认为)。可以接受吗?

这会将此逻辑移至构造函数或 SetParameters 方法。

[Parameter] public RenderFragment NullTemplate { get; set; } = builder => StubTemplate(builder, "Null");
[Parameter] public RenderFragment EmptyTemplate { get; set; } = builder => StubTemplate(builder, "Empty");

private static void StubTemplate(RenderTreeBuilder __builder, string what)
{
    <span style="color: red">@what</span>
}

请注意,__builder 名称是必需的。
然后你不再需要主组件中的任何条件代码:

@if (Items == null)
{
   @NullTemplate
}

或者,您可以省略 属性 初始化并执行 :

 @(EmptyTemplate ?? (builder => StubTemplate(builder, "Empty")))

但我会被所有 ().

弄晕