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

Blazor调用Controller获取List数据不渲染、列表计数始终为0问题求助

问题根因及解决方案


1. 控制器路由配置不匹配

你的TodoItemsController未添加Web API必备的特性标记,导致前端请求的api/TodoItems路径无法匹配到对应的GetItems方法,请求失败后未捕获异常,todos始终为初始化的空列表,所以页面计数为0、无内容渲染。你直接浏览器访问链接能返回数据,大概率是你测试时用的路径包含Action名、或者本地有其他路由规则适配,和Blazor前端的请求路径不一致。

解决方法:给控制器添加路由和ApiController特性:

[ApiController]
[Route("api/[controller]")]
public class TodoItemsController : ControllerBase
{
    // 保留原有代码不变
}

添加后[HttpGet]标记的GetItems方法的默认访问路径就是api/TodoItems,和前端请求地址完全匹配。


2. 异常捕获范围不全,无法感知请求错误

现有代码仅捕获了AccessTokenNotAvailableException,请求404、反序列化失败、网络错误等其他异常都没有处理,请求失败后你无法感知问题,页面直接用初始空列表渲染。
解决方法:补充异常捕获和空值判断:

protected override async Task OnInitializedAsync()
{
    try
    {
        var result = await http.GetFromJsonAsync<List<TodoItem>>("api/TodoItems");
        // 防止接口返回null覆盖列表
        if(result != null)
        {
            todos = result;
        }
    }
    catch (AccessTokenNotAvailableException exception)
    {
        exception.Redirect();
    }
    catch(Exception ex)
    {
        // 开发阶段可输出到控制台排查问题
        Console.WriteLine($"待办列表请求失败: {ex.Message}");
    }
}

3. 可选优化点

  • 将页面中@todos.Count()改为@todos.Count,List<T>自带Count属性,无需调用LINQ扩展方法,性能更优。
  • 确认控制器是否需要加[Authorize]特性:你的服务端已配置JWT认证,如果你要求接口必须登录才能访问,就给控制器添加[Authorize]特性,当前你直接浏览器能访问说明接口是匿名可访问的,注意根据业务需求调整。
  • 确认AzureAD配置的scope是否正确:前端配置的api://api.id.uri/access_as_user需要和Azure后台注册的API暴露的scope一致,否则会出现获取token失败的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:06:05