为什么Blazor WebAssembly @foreach {}无法呈现列表?

时间:2020-10-17 21:49:46

标签: c# razor blazor blazor-webassembly

我不知道为什么这个列表渲染不再起作用,并抛出一个奇怪的异常:

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer [100] 未处理的异常呈现组件:可为空的对象必须具有一个值。 System.InvalidOperationException:可为空的对象必须具有一个值。 在System.Nullable`1 [T] .get_Value()<0x28f3be8 + 0x0000a>中:: 0 在C:\ Users \ vOId \ Desktop \ projects \ collAnon \ collAnon.Pub \ Client \ Components \ Threads中的collAnon.Pub.Client.Components.Threads.BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)[0x010c7]剃刀:106 在Microsoft.AspNetCore.Components.ComponentBase。<。ctor> b__6_0(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder构建器)<0x2d39550 + 0x0001a>在:0中 在Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder batchBuilder,Microsoft.AspNetCore.Components.RenderFragment renderFragment)<0x2d38ea8 + 0x00062>在:0中 在Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderInExistingBatch(Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry renderQueueEntry)<0x2d388a8 + 0x0004c>在:0中 在Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()<0x2d35ce8 + 0x00098>的:0

通常会初始化列表,从服务器获取数据并将其添加到列表以进行渲染(ViewThreads):

protected async override Task OnInitializedAsync()
{
    var result = await ThreadService.GetThreads();
    if (result.IsValid)
        ViewThreads.AddRange((List<ViewThread>)result.Data);
    //...
}

与此同时,在@foreach的第一条指令的渲染点(第106行),这是渲染

//...
@foreach (var thread in ViewThreads)
{
    <p class="button is-light is-rounded neoFile petite-caps mb-3 @(CurrentThread != null && CurrentThread.Id == thread.Id ? "isSelected" : null)"
            @onclick="() => SelectThread(thread)" @key="thread">
        @thread.Title
    </p>
}
//...

这部分代码没有改变,只是列表的呈现突然抛出该异常而元素不再呈现。

可能是什么? 有人有类似的问题吗?

2 个答案:

答案 0 :(得分:1)

初始化ViewThreads对象:

public List<ViewThread> ViewThreads { get; set; } = new List<ViewThread>();

或将foreach环绕在if (ViewThreads != null)周围:

if (ViewThreads != null)
{
    @foreach (var thread in ViewThreads)
    {
        <p class="button is-light is-rounded neoFile petite-caps mb-3 @(CurrentThread != null && CurrentThread.Id == thread.Id ? "isSelected" : null)"
            @onclick="() => SelectThread(thread)" @key="thread">
            @thread.Title
        </p>
    }
}

答案 1 :(得分:1)

可空对象必须有一个值。

您在此处发布的代码不会产生该错误。正如您自己说的那样,“这部分代码没有改变”

在某种程度上,您已将其替换为...。寻找可为空的属性。

“突然出现该列表的呈现”很可能是由数据引起的。某些专栏在您没想到的地方出现了空值。