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

Blazor中如何在foreach循环内发起网络请求更新设备在线状态

Blazor实现表格动态拉取设备在线状态方案

1. 定义设备数据模型

新增设备实体类,预留在线状态字段,初始值设为null用于标识加载中状态:

public class Device
{
    // 设备唯一标识,用于请求在线状态
    public int Id { get; set; }
    public string DeviceName { get; set; }
    // 其他设备业务属性...
    // null=加载中, true=在线, false=离线
    public bool? IsOnline { get; set; }
}

2. 编写组件逻辑

首先确保你已经在Program.cs中注册了HttpClient服务,组件中直接注入HttpClient使用即可:

@inject HttpClient Http

<!-- 设备表格 -->
<table class="table">
    <thead>
        <tr>
            <th>设备名称</th>
            <th>Is Online</th>
            <!-- 其他表格列 -->
        </tr>
    </thead>
    <tbody>
        @foreach (var device in DeviceList)
        {
            <tr>
                <td>@device.DeviceName</td>
                <td>
                    @if (device.IsOnline == null)
                    {
                        <span>加载中...</span>
                    }
                    else
                    {
                        <span>@(device.IsOnline.Value ? "Yes" : "No")</span>
                    }
                </td>
            </tr>
        }
    </tbody>
</table>

@code {
    // 设备列表数据源
    private List<Device> DeviceList { get; set; } = new();

    protected override async Task OnInitializedAsync()
    {
        // 第一步:先拉取所有设备的基础信息,渲染表格框架
        DeviceList = await Http.GetFromJsonAsync<List<Device>>("api/device/get-all");
        
        // 第二步:异步拉取每个设备的在线状态,不阻塞主页面渲染
        foreach (var device in DeviceList)
        {
            // *注意这里不要直接await,否则会变成串行请求大幅增加加载耗时*
            _ = GetOnlineStatus(device);
        }
    }

    /// <summary>
    /// 拉取单个设备的在线状态
    /// </summary>
    private async Task GetOnlineStatus(Device device)
    {
        try
        {
            // 携带设备ID请求服务端接口,接口路径替换为你的实际地址
            var isOnline = await Http.GetFromJsonAsync<bool>($"api/device/check-online?deviceId={device.Id}");
            device.IsOnline = isOnline;
        }
        catch
        {
            // 请求异常默认标记为离线,可根据业务需求调整
            device.IsOnline = false;
        }
        // 通知Blazor刷新对应行的UI
        StateHasChanged();
    }
}

3. 可选优化项

  • 若设备数量超过20台,建议将单个查询接口修改为批量查询接口,一次性传入所有设备ID拉取状态,减少HTTP请求次数
  • 可给加载中状态添加动画图标优化用户体验
  • 如需实时更新在线状态,新增定时器定时调用GetOnlineStatus方法即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:45:01