6

我想简化以下

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

???.

可能吗?

试图

我在下面的尝试

  • @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; }
}

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

4

1 回答 1

2

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

这会将这个逻辑移动到构造函数或 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")))

但我会被所有的().

于 2020-07-05T10:36:15.990 回答