You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Telerik项目中IEnumerable属性API调用后为空的问题

解决Blazor中OnInitialized后Users为空引发的空引用异常

核心原因

Blazor组件渲染流程中,UI会在OnInitialized(尤其是异步版本)完成前执行首次渲染,此时未初始化的Users属性为null,直接绑定就会触发System.NullReferenceException。

具体解决办法

1. 给Users属性初始化默认空集合

在组件类里直接给Users赋初始值,从根源避免null状态:

// 初始化时赋值空集合,而非默认null
public IEnumerable<UvwUser> Users = Enumerable.Empty<UvwUser>();

即使API请求还未完成,UI绑定的也是一个空集合,不会触发空引用。

2. 使用异步生命周期方法OnInitializedAsync

如果API调用是异步的,必须用异步生命周期方法,确保等待数据加载完成后再更新UI:

protected override async Task OnInitializedAsync()
{
    // 调用API获取数据
    var apiResponse = await HttpClient.GetFromJsonAsync<List<UvwUser>>("your-api-endpoint");
    // 排序后赋值,同时处理API返回null的情况
    Users = apiResponse?.OrderBy(u => u.Surname).ThenBy(u => u.Forename) ?? Enumerable.Empty<UvwUser>();
}

注意:禁止在同步的OnInitialized里调用异步方法(比如用.Result),这会导致线程阻塞和渲染异常。

3. UI层添加空值检查

在渲染用户列表的地方,用@if判断Users状态,或者使用空合并运算符:

<!-- 方式1:先判断再渲染,同时展示加载提示 -->
@if (Users != null)
{
    <TelerikGrid Data="@Users">
        <GridColumns>
            <GridColumn Field="@nameof(UvwUser.Forename)" Title="名" />
            <GridColumn Field="@nameof(UvwUser.Surname)" Title="姓" />
            <GridColumn Field="@nameof(UvwUser.Username)" Title="用户名" />
        </GridColumns>
    </TelerikGrid>
}
else
{
    <p>加载用户数据中...</p>
}

<!-- 方式2:使用空合并运算符直接绑定空集合 -->
<TelerikGrid Data="@(Users ?? Enumerable.Empty<UvwUser>())">
    <!-- 列定义同上 -->
</TelerikGrid>

4. 利用Telerik组件的内置加载状态

Telerik Blazor组件(比如Grid)支持内置加载状态,可配合异步操作提升用户体验:

<TelerikGrid Data="@Users" Loading="@isLoading">
    <GridColumns>
        <GridColumn Field="@nameof(UvwUser.Forename)" Title="名" />
        <GridColumn Field="@nameof(UvwUser.Surname)" Title="姓" />
        <GridColumn Field="@nameof(UvwUser.Username)" Title="用户名" />
    </GridColumns>
</TelerikGrid>

@code {
    private bool isLoading;
    public IEnumerable<UvwUser> Users = Enumerable.Empty<UvwUser>();

    protected override async Task OnInitializedAsync()
    {
        isLoading = true;
        try
        {
            var apiResponse = await HttpClient.GetFromJsonAsync<List<UvwUser>>("your-api-endpoint");
            Users = apiResponse?.OrderBy(u => u.Surname).ThenBy(u => u.Forename) ?? Enumerable.Empty<UvwUser>();
        }
        finally
        {
            isLoading = false;
        }
    }
}

内容的提问来源于stack exchange,提问作者bgcode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:10:33