ASP.NET Core 8.0 Razor遍历Model时出现NullReferenceException问题
解决Razor Pages遍历Car列表时的NullReferenceException异常
问题原因
你的OnGetAsync方法使用了async void返回类型,这是Razor Pages异步处理方法的典型错误。ASP.NET Core无法正确等待async void方法执行完成,页面会在API请求还未返回、Cars属性还未被赋值时就开始渲染——此时Cars实际为null(尽管你加了default!的空值抑制),遍历null集合自然会抛出NullReferenceException。
修复方案
1. 修正异步方法返回类型
将OnGetAsync的返回类型从async void改为async Task,让框架能等待数据加载完成后再渲染页面。
2. 优化HttpClient使用(可选但推荐)
你已经在Program.cs中注册了AddHttpClient(),直接注入HttpClient替代手动创建,能复用连接池,避免资源泄漏。
3. 初始化Cars为空列表
把Cars的默认值从default!改为空列表[],即使API返回null,也能保证遍历的是一个空集合,不会触发空引用异常。
修正后的完整代码
Index.cshtml.cs
using System.Text.Json; using Microsoft.AspNetCore.Mvc.RazorPages; namespace CarApp.Pages; public class CarPageModel : PageModel { private readonly ILogger<CarPageModel> _logger; private readonly HttpClient _httpClient; // 注入框架管理的HttpClient public CarPageModel(ILogger<CarPageModel> logger, HttpClient httpClient) { _logger = logger; _httpClient = httpClient; } // 初始化为空列表,避免null public List<Car> Cars { get; set; } = []; // 异步方法返回Task而非void public async Task OnGetAsync() { var uri = new Uri("http://localhost:5009/api/cars"); using var response = await _httpClient.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false); response.EnsureSuccessStatusCode(); var stream = await response.Content.ReadAsStreamAsync(); var serializerOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var data = await JsonSerializer.DeserializeAsync<List<Car>>(stream, serializerOptions); Cars = data ?? []; } }
关于return View()的说明
这个建议是针对MVC控制器的,在Razor Pages中不需要手动返回视图——页面模型的处理方法执行完成后,框架会自动渲染对应的.cshtml页面,和你的场景无关。
内容的提问来源于stack exchange,提问作者Jebathon
相关产品推荐
相关产品推荐

