如何使用?。或者 ??有条件地呈现Blazor 模板?

Mon*_*mer 6 c# razorengine asp.net-core blazor blazor-webassembly

我想简化以下内容

@if (Template != null)
{
    @Template
}
else
{
    <span>No contents!</span>
}
Run Code Online (Sandbox Code Playgroud)

???.

是否可以?

试图

我在下面的尝试

  • @Template?.BeginInvoke()
  • @{Template==null? @Template : <span> No data to display! </span>}
  • @(Template??<span> No data to display! </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; }
}
Run Code Online (Sandbox Code Playgroud)

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

Hen*_*man 2

当您将部件存储为 RenderFragments 时,它可以工作(我认为)<span style="color: red">Null...</span>。这样可以接受吗?

这会将此逻辑移至构造函数或 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>
}
Run Code Online (Sandbox Code Playgroud)

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

@if (Items == null)
{
   @NullTemplate
}
Run Code Online (Sandbox Code Playgroud)

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

 @(EmptyTemplate ?? (builder => StubTemplate(builder, "Empty")))
Run Code Online (Sandbox Code Playgroud)

但我会对所有这些感到头晕()