Blazor中Apex Charts空引用异常排查与修复求助
问题
将原本可正常运行的Radzen Blazor图表转换为Apex Charts以实现堆叠柱状图功能,调试确认所有集合均有值,但仍触发空引用异常,错误信息如下:
object reference not set to an instance of an object. at apexcharts.apexpointseries`1.oninitialized() at microsoft.aspnetcore.components.componentbase.runinitandsetparametersasync()
相关代码:
@if (loaded && weathers != null && weathers.Count() > 0 && !weathersLoading && options != null) { <ApexChart TItem="object" Title="Temperature Chart" Options=@options XAxisType="XAxisType.Category" Debug> <ApexPointSeries TItem="Data.Entities.Weather" Items="weathers.Where(w => w.HighTemp != null)" Name="High Temp" SeriesType="SeriesType.Bar" XValue="@(e => e.DateP)" YValue="@(e => (decimal?)e.HighTemp)" OrderBy="e => e.X" /> <ApexPointSeries TItem="Data.Entities.Weather" Items="weathers.Where(w => w.LowTemp != null)" Name="Low Temp" SeriesType="SeriesType.Bar" XValue="@(e => e.DateP)" YValue="@(e => (decimal?)e.LowTemp)" OrderBy="e => e.X" /> @if (averages != null && averages.Count() > 0) { List<AvgHigh> avsH = averages.Select(g => new AvgHigh() { Date = weathers.First(lw => lw.Date.DayOfYear == g.Key).Date, AvgHighTemp = g.Average(w => w.HighTemp) ?? 0, DateP = Business.Home.GregorianToP2( weathers.First(lw => lw.Date.DayOfYear == g.Key).Date).Substring(2) }).ToList(); List<AvgLow> avsL = averages.Select(g => new AvgLow() { Date = weathers.First(lw => lw.Date.DayOfYear == g.Key).Date, AvgLowTemp = g.Average(w => w.LowTemp) ?? 0, DateP = Business.Home.GregorianToP2( weathers.First(lw => lw.Date.DayOfYear == g.Key).Date).Substring(2) }).ToList(); <ApexPointSeries TItem="AvgHigh" Items="@avsH" Name="Avg High" SeriesType="SeriesType.Line" XValue="@(e => e.DateP)" YValue="@(e => (decimal?)e.AvgHighTemp)" OrderBy="e=>e.X" /> <ApexPointSeries TItem="AvgLow" Items="@avsL" Name="Avg Low" SeriesType="SeriesType.Line" XValue="@(e => e.DateP)" YValue="@(e => (decimal?)e.AvgLowTemp)" OrderBy="e=>e.X" /> } </ApexChart> @code { private ApexChartOptions<object> options = new ApexChartOptions<object> { Chart = new Chart { Stacked = true }, PlotOptions = new PlotOptions { Bar = new PlotOptionsBar { Horizontal = false } }, Colors = new List<string> { "#ffa500", "#4169e1", "#ff0000", "#ffffff" } }; }
解决方案
- 修正根图表泛型类型:将
<ApexChart TItem="object">改为具体类型,比如<ApexChart TItem="Data.Entities.Weather">。使用object作为根类型会导致组件内部初始化时无法正确解析系列的类型元数据,触发空引用。 - 删除无效的
OrderBy参数:所有ApexPointSeries中的OrderBy="e => e.X"均无效,因为你的实体(Weather、AvgHigh、AvgLow)没有X属性。该错误表达式会在组件初始化时尝试访问不存在的成员,引发空引用异常,直接删除所有OrderBy属性即可。 - 统一X轴值格式:确保所有系列的
XValue返回的DateP字符串格式完全一致,避免因X轴值不匹配导致内部处理错误。 - 优化集合初始化逻辑:生成
avsH和avsL时,避免重复查询weathers,先缓存查询结果,同时防止因找不到对应项引发潜在异常:List<AvgHigh> avsH = averages.Select(g => { var weatherItem = weathers.First(lw => lw.Date.DayOfYear == g.Key); return new AvgHigh() { Date = weatherItem.Date, AvgHighTemp = g.Average(w => w.HighTemp) ?? 0, DateP = Business.Home.GregorianToP2(weatherItem.Date).Substring(2) }; }).ToList(); List<AvgLow> avsL = averages.Select(g => { var weatherItem = weathers.First(lw => lw.Date.DayOfYear == g.Key); return new AvgLow() { Date = weatherItem.Date, AvgLowTemp = g.Average(w => w.LowTemp) ?? 0, DateP = Business.Home.GregorianToP2(weatherItem.Date).Substring(2) }; }).ToList();
内容的提问来源于stack exchange,提问作者mz1378
相关产品推荐
相关产品推荐

