如何使用?要么 ??有条件地渲染Blazor模板?

时间:2020-07-03 02:01:01

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

我想简化以下内容

if statements

使用 if(sauhp.length < 1){ //sauhp is empty and not a bot - proceed const token = await this.$recaptcha(formType); //Send the token to validate let verifyReCaptcha = await axios.get('/api/recaptcha/api/siteverify?secret='+secret+'&response='+token); let reCaptchaResponse = verifyReCaptcha.data; //Validate the action if(reCaptchaResponse.action === formType){ //Process the form if(reCaptchaResponse.score > 1){ console.log('yes great go ahead') }else{ window.$nuxt.error({ statusCode: 500, message: "We've detected a problem in the form submission. Call us, we're here to help." }) } } }else{ window.$nuxt.error({ statusCode: 500, message: "We've detected a problem in the form submission. Call us, we're here to help." }) } }, @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>)属性中,在将它们(字段)呈现为HTML之前对其进行预处理。换句话说,@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; } } 指令中不允许有其他代码。

1 个答案:

答案 0 :(得分: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")))

但是我会为所有()感到头晕。