Blazor Server端.NET 5下NullReferenceException异常修复咨询
修复Blazor Server中DevExpress DataGrid导出功能的NullReferenceException异常
你的空引用异常根源很明确:ExportUrlInfo属性没有初始化就直接访问它的CollectionChanged事件。
看你的代码细节:
- 私有字段
exportUrlInfo已经用new ObservableCollection<Tuple<string, string>>()完成了初始化; - 但公开的
ExportUrlInfo属性只定义了get/set方法,却没有赋值,它在OnInitializedAsync执行时还是null,所以当你尝试绑定CollectionChanged事件时,自然抛出Object reference not set to an instance of an object异常。
具体修复方案(二选一即可)
方案1:直接初始化ExportUrlInfo属性
修改属性声明,在定义时直接完成初始化,同时可以去掉冗余的私有字段:
// 直接初始化公开属性 public ObservableCollection<Tuple<string, string>> ExportUrlInfo { get; set; } = new ObservableCollection<Tuple<string, string>>();
然后在LoadOrderData方法里直接操作这个公开属性:
protected Task<LoadResult> LoadOrderData(DataSourceLoadOptionsBase options, CancellationToken cancellationToken) { string baseUri = NavigationManager.BaseUri.ToString(); ExportUrlInfo.Clear(); ExportUrlInfo.Add(Tuple.Create(options.ConvertToGetRequestUri(baseUri + "exportPdf"), "Export PDF")); ExportUrlInfo.Add(Tuple.Create(options.ConvertToGetRequestUri(baseUri + "exportXlsx"), "Export XLSX")); ExportUrlInfo.Add(Tuple.Create(options.ConvertToGetRequestUri(baseUri + "exportDocx"), "Export DOCX")); return Task.FromResult(DataSourceLoader.Load(AccountList, options)); }
方案2:将私有字段赋值给ExportUrlInfo属性
如果想保留私有字段的封装,就在OnInitializedAsync的最开头完成赋值,避免空引用:
protected override async Task OnInitializedAsync() { // 先给公开属性赋值,确保不为null ExportUrlInfo = exportUrlInfo; // 再执行后续业务逻辑 AccountList = await Controller.GetAccountAsync(); ListOfAccountTypes = new List<ComboBoxItem>() { new ComboBoxItem(0,"Dư Nợ"), new ComboBoxItem(1,"Dư Có"), new ComboBoxItem(2,"Lưỡng tính") }; ExportUrlInfo.CollectionChanged += (s, e) => { InvokeAsync(StateHasChanged); }; }
额外检查提示
顺便确认下Controller实例是否已通过依赖注入等方式正确初始化,虽然堆栈跟踪指向CollectionChanged代码行,但如果Controller为null,await Controller.GetAccountAsync()也会触发空引用异常,提前排查可以避免后续问题。
内容的提问来源于stack exchange,提问作者Fiyaz Hasan
相关产品推荐
相关产品推荐

