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

Blazor项目中从URL获取数据后变量未赋值问题求助

Blazor中TestSuitesResult.count始终为null并抛出错误

我遇到这个问题已经有一段时间了,于是创建了一个新的Blazor项目来复现错误,以下是项目中的相关文件,核心问题是页面中的@TestSuitesResult.count始终为null并抛出空引用错误。


index.razor 文件代码

@using BlazorApp1.Models.TestSuiteModel; 
@inject BlazorApp1.Services.TestSuiteService TestSuiteServ; 
@page "/"

<b> 
    @TestSuitesResult.count; 
</b>

@code {
    protected override async Task OnInitializedAsync()
    {
        this.GetTestSuites(); 
    }

    TestSuiteModel TestSuitesResult;
    protected async Task GetTestSuites()
    {
        TestSuiteServ.url = "https://dev.azure.com/****/_apis/test/Plans/12/suites?api-version=5.0";
        TestSuiteServ.PersonalAccessToken = "****";
        TestSuitesResult = await TestSuiteServ.GetTestSuites();
        await base.OnInitializedAsync();
    }
}

TestSuiteModel 模型代码

namespace BlazorApp1.Models.TestSuiteModel
{
    public class TestSuiteModel
    {
        public List<Value> value { get; set; }
        public int count { get; set; }
    }
 // .. 其他模型类
}

TestSuiteService 服务代码

using BlazorApp1.Models.TestSuiteModel;
using Newtonsoft.Json;
using System.Net.Http.Headers;

namespace BlazorApp1.Services
{
    public class TestSuiteService
    {
        public string url { get; set; }
        public string PersonalAccessToken { get; set; }
        TestSuiteModel result;

        public async Task<TestSuiteModel> GetTestSuites()
        {
            using (HttpClient client = new HttpClient())
            {
                // 接受JSON格式响应
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json")
                );

                // 将DevOps令牌添加到HTTP请求头
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
                    "Basic", Convert.ToBase64String(
                        System.Text.Encoding.ASCII.GetBytes(
                            string.Format("{0}:{1}", "", PersonalAccessToken)
                        )
                    )
                );

                HttpResponseMessage response = await client.GetAsync(url);
                response.EnsureSuccessStatusCode();
                string responseData = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<TestSuiteModel>(responseData);
            }
        }
    }
}

Program.cs 服务注册配置

// 注册服务到容器
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddSingleton<TestSuiteService>(); <!-- 我的自定义服务 -->

var app = builder.Build();

问题解决思路

1. 修复页面渲染时的空引用问题

页面初始化时TestSuitesResult还未完成异步加载,直接访问count会触发空引用错误。可以添加空值检查:

<b> 
    @(TestSuitesResult?.count ?? 0)
</b>

2. 修正异步方法调用逻辑

OnInitializedAsync中调用GetTestSuites()时没有使用await,导致页面在数据返回前就完成渲染。修改为:

protected override async Task OnInitializedAsync()
{
    await this.GetTestSuites(); 
}

3. 确保JSON序列化字段匹配

Azure DevOps API返回的JSON字段可能存在大小写差异,建议显式指定JsonProperty特性确保匹配:

public class TestSuiteModel
{
    public List<Value> value { get; set; }
    [JsonProperty("count")]
    public int count { get; set; }
}

同时可以在GetTestSuites方法中输出responseData,查看API实际返回的JSON结构是否与模型一致。

4. 调整服务生命周期

当前TestSuiteService注册为单例,但服务中包含url和PersonalAccessToken这类实例属性,多场景调用时容易出现数据冲突。建议改为瞬态或作用域服务:

builder.Services.AddTransient<TestSuiteService>();
// 或者
builder.Services.AddScoped<TestSuiteService>();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:10:45