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{}指令中不允许有额外的代码。
当您将部件存储为 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)
但我会对所有这些感到头晕()。
| 归档时间: |
|
| 查看次数: |
1284 次 |
| 最近记录: |