【发布时间】:2023-01-08 22:28:06
【问题描述】:
我遇到这个问题已经有一段时间了,所以为了重现错误,我创建了一个新的 Blazor 项目来向您展示所有文件。
这是我的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();
}
}
问题是 @TestSuitesResult.count; 始终为 null 并抛出此错误:
下面是我的模型
namespace BlazorApp1.Models.TestSuiteModel
{
public class TestSuiteModel
{
public List<Value> value { get; set; }
public int count { get; set; }
}
// .. mode classes
}
以下是我的服务
using BlazorApp1.Models.TestSuiteModel;
using Newtonsoft.Json;
using System.Net.Http.Headers;
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())
{
// accept response as JSON
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json")
);
// add DevOps token to the HTTP Header request
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 中注册服务外,我没有修改或删除默认 Blazor 项目中的任何文件
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddSingleton<TestSuiteService>(); <!-- my service -->
var app = builder.Build();
还添加了 Newtonsoft,因此它不会是缺少的库。
【问题讨论】:
-
除了答案中突出显示的 await 问题外,
TestSuitesResult可以为空,但您在尝试显示它之前不检查空值。麻烦的秘诀!你启用了 Nullable 吗?你应该收到警告。 -
@MrCakaShaunCurtis 这只是我创建的快速演示项目,通常我会检查 null
-
将
@page移至文档顶部。