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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:06:11