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
相关产品推荐
相关产品推荐

