如何使用?要么 ??有条件地呈现 Blazor 模板?
How to use either ?. or ?? to conditionally render Blazor template?
我想简化以下内容
@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{}
指令中添加其他代码。
当您将 <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")))
但我会被所有 ()
.
弄晕
我想简化以下内容
@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{}
指令中添加其他代码。
当您将 <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")))
但我会被所有 ()
.