【问题标题】:How to use either ?. or ?? to conditionally render Blazor template?如何使用?要么 ??有条件地呈现 Blazor 模板?
【发布时间】:2020-10-23 16:55:53
【问题描述】:

我想简化以下内容

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

???.

有可能吗?

尝试

我在下面的尝试

  • @Template?.BeginInvoke()
  • @{Template==null? @Template : &lt;span&gt; No data to display! &lt;/span&gt;}
  • @(Template??&lt;span&gt; No data to display! &lt;/span&gt;)

产生红色波浪线。

编辑

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

@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{} 指令中不允许有额外的代码。

【问题讨论】:

  • 我不是 blazor 或 razor 语法方面的专家,但是除非您完全在代码中完成此操作,否则这将是最好的......
  • @TheGeneral:我不想创建从ComponentBase 派生的部分类,因为用BuildRenderTree 生成HTML 真的很麻烦!

标签: c# asp.net-core blazor blazor-webassembly razorengine


【解决方案1】:

当您将&lt;span style="color: red"&gt;Null...&lt;/span&gt; 部分存储为 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")))

但我会被所有的() 弄得头晕目眩。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2017-06-21
    • 2011-10-19
    • 2019-05-20
    • 2022-12-19
    • 2023-04-09
    相关资源
    最近更新 更多