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

Blazor Server使用EF Core ToListAsync()时下拉框数据不加载问题

解决Blazor Server异步加载下拉框无数据问题

1. 修正服务调用的变量名错误

你的LocationPicker.razor中注入的服务是dataservice,但在OnInitializedAsync里调用的是matchservice.GetActiveSites(),这会触发空引用异常。异步方法中的异常不会直接中断程序,而是会被静默处理,最终导致下拉框无数据。

修改代码:

protected override async Task OnInitializedAsync()
{
    SiteListDropDownValues = await dataservice.GetActiveSites();
}

2. 修正父组件TelerikForm的Model绑定错误

Location.razor中TelerikForm的Model属性绑定的是类型ParentObj,而非实例parentobjt,这会导致表单上下文异常,可能影响子组件的参数传递和渲染。

修改代码:

<TelerikForm Model="@parentobjt">

3. 显式触发组件状态更新(可选)

虽然Blazor在异步操作后通常会自动触发重新渲染,但复杂组件嵌套场景下,显式调用StateHasChanged()可确保数据更新后组件重新渲染:

protected override async Task OnInitializedAsync()
{
    try
    {
        SiteListDropDownValues = await dataservice.GetActiveSites();
        StateHasChanged();
    }
    catch (Exception ex)
    {
        // 输出异常到控制台排查问题
        Console.WriteLine($"加载站点列表失败:{ex.Message}");
    }
}

4. 检查DbContext的异步兼容性

确保_matchDBContext是Scoped生命周期(Blazor Server中DbContext推荐使用Scoped),避免异步操作完成前DbContext被提前释放。优化仓储层代码:

public async Task<List<Site>> GetActiveSites()
{
    using var ctx = _matchDBContext.CreateDbContext();
    return await ctx.Sites
        .Where(s => s.Active && !s.Deleted)
        .OrderBy(s => s.Name)
        .ToListAsync();
}

5. 验证异步调用返回数据

在服务层添加日志,确认GetActiveSites()异步方法确实返回数据,排除查询条件导致无结果的情况:

public async Task<List<Site>> GetActiveSites()
{
    var sites = await _repo.GetActiveSites();
    Console.WriteLine($"异步加载站点数量:{sites.Count}");
    return sites;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:48:14