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

Blazor ASP.NET 6解决空引用异常及创建全局变量LookupJenisDokumenList

解决方案

一、解决空引用异常

空引用异常的核心原因是LookupClient未被正确注入,或ILookupClient服务未注册到DI容器。按以下步骤修复:

  1. 注册ILookupClient服务
    在客户端项目的Program.cs中添加服务注册代码,确保DI容器能提供ILookupClient的实例:
// 替换LookupClient为你的ILookupClient实现类
builder.Services.AddScoped<ILookupClient, LookupClient>();
  1. 注册LookupService为全局服务
    要让LookupJenisDokumenList成为全局可访问变量,需将LookupService注册到DI容器,推荐注册为单例(全局唯一实例):
builder.Services.AddSingleton<LookupService>();
  1. 完善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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:05:20