Blazor ASP.NET 6解决空引用异常及创建全局变量LookupJenisDokumenList
解决方案
一、解决空引用异常
空引用异常的核心原因是LookupClient未被正确注入,或ILookupClient服务未注册到DI容器。按以下步骤修复:
- 注册ILookupClient服务
在客户端项目的Program.cs中添加服务注册代码,确保DI容器能提供ILookupClient的实例:
// 替换LookupClient为你的ILookupClient实现类 builder.Services.AddScoped<ILookupClient, LookupClient>();
- 注册LookupService为全局服务
要让LookupJenisDokumenList成为全局可访问变量,需将LookupService注册到DI容器,推荐注册为单例(全局唯一实例):
builder.Services.AddSingleton<LookupService>();
- 完善LookupService代码
- 初始化私有字段避免返回null
- 添加
LookupClient的null检查,防止调用方法时抛出异常 - 实现
INotifyPropertyChanged接口,用于通知UI数据更新
修改后的代码:
using System.ComponentModel; using System.Runtime.CompilerServices; namespace Atana.Bc.Frontend.Client.Pages.BeaCukai { public class LookupService : INotifyPropertyChanged { // 初始化空集合,避免返回null private IEnumerable<LookupDto> _lookupJenisDokumen = Enumerable.Empty<LookupDto>(); [Inject] public ILookupClient LookupClient { get; set; } = default; public IEnumerable<LookupDto> LookupJenisDokumenList { get => _lookupJenisDokumen; set { if (!Equals(_lookupJenisDokumen, value)) { _lookupJenisDokumen = value ?? Enumerable.Empty<LookupDto>(); OnPropertyChanged(); Reload(); } } } public async Task LoadLookup() { try { // 先检查LookupClient是否为null if (LookupClient == null) { throw new InvalidOperationException("LookupClient未被正确注入"); } var lookup = await LookupClient.GetAllAsync(31); if (lookup != null) { LookupJenisDokumenList = lookup.Lookup ?? Enumerable.Empty<LookupDto>(); } } catch (Exception ex) { // 可添加日志记录后再抛出异常 throw; } } private void Reload() { // 这里添加自定义刷新逻辑,比如触发特定业务操作 } // 实现INotifyPropertyChanged用于通知UI更新 public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
二、全局使用LookupJenisDokumenList
在需要访问该全局变量的Blazor组件中,通过注入LookupService获取数据:
@inject LookupService LookupService <h3>文档类型列表</h3> <ul> @foreach (var item in LookupService.LookupJenisDokumenList) { <li>@item.Name</li> } </ul> @code { protected override async Task OnInitializedAsync() { await LookupService.LoadLookup(); } }
内容的提问来源于stack exchange,提问作者jabbar atana
相关产品推荐
相关产品推荐

