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

Blazor CRUD应用数据检索返回空数组引发空引用异常排查

Hey there, let's work through your Blazor CRUD issues step by step—those outdated pre-release tutorials can definitely throw you off, so I'll break down each problem with practical fixes.

1. Fixing the NullReferenceException in Index.razor

The error happens because your component is trying to iterate over a Users[] variable that's still null when the component first renders. Blazor renders components asynchronously, so your data fetch from the database won't be ready immediately.

Quick fixes:

  • Initialize your user list with an empty array to avoid null references during initial render:
    @inject UserService UserService
    @foreach (var user in _users)
    {
        <!-- Your user rendering code here -->
    }
    
    @code {
        // Initialize with empty array instead of leaving it null
        private Users[] _users = Array.Empty<Users>();
    
        protected override async Task OnInitializedAsync()
        {
            // Fetch data asynchronously once the component initializes
            _users = await UserService.GetAllUsersAsync();
        }
    }
    
  • Add a null check directly in the @foreach (if you prefer not to initialize upfront):
    @foreach (var user in _users ?? Array.Empty<Users>())
    {
        <!-- Your user rendering code here -->
    }
    
  • Double-check your UserService's data fetch method: Make sure it returns an empty array instead of null if no users are found (though you said the table has data, this is a good safeguard):
    public async Task<Users[]> GetAllUsersAsync()
    {
        // ToArrayAsync() will return an empty array if there are no records, not null
        return await _context.Users.ToArrayAsync();
    }
    

2. Resolving Service Registration Errors (AddSingleton vs AddTransient)

The System.AggregateException when using AddSingleton is a common Blazor lifecycle conflict:

  • By default, EF Core's DbContext (your UserManagementContext) is registered as a Scoped service—meaning it's created once per request/scope.
  • A Singleton service exists for the entire lifetime of the app. Blazor blocks injecting shorter-lifecycle services (like Scoped DbContexts) into longer-lifecycle services (Singletons) because it can lead to stale data or resource leaks.

Correct registration approach:

First, ensure your UserManagementContext is registered properly (in Startup.cs or Program.cs for .NET 6+):

services.AddDbContext<UserManagementContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("YourConnectionString")));

Then register your UserService as either Scoped (recommended for Blazor components) or Transient:

// Scoped matches the component lifecycle and DbContext's scope
services.AddScoped<UserService>();

// Or Transient (creates a new instance every time it's requested)
// services.AddTransient<UserService>();

Both will work because their lifecycles are compatible with the Scoped DbContext.

Bonus: Safeguard your UserService constructor

Add a null check to ensure your UserManagementContext is never null when the service is created:

public class UserService
{
    private readonly UserManagementContext _context;

    public UserService(UserManagementContext context)
    {
        // Throw early if context is null to catch issues quickly
        _context = context ?? throw new ArgumentNullException(nameof(context));
    }

    // Your CRUD methods here
}

Final Checks

  • Verify your database connection string is correct in appsettings.json—a bad connection could mean your service isn't actually fetching data.
  • Use breakpoints in your UserService's GetAllUsersAsync method to confirm _context.Users returns data from the database.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:48:13