Blazor简单页面中StateHasChanged引发空引用异常求助
排查Blazor+Radzen标签页编辑组件空引用异常思路
核心问题
点击列表编辑按钮切换到标签页2时,TestVS组件的LoadVessel方法调用StateHasChanged()抛出空引用异常,此前相同实现逻辑无异常。
排查步骤
检查组件实例化方式与依赖注入有效性
你通过new()手动创建TestVS实例:private TestVS selectedSchedule = new();Blazor组件手动实例化时依赖注入不会自动生效,比如
vesselData、navigation等注入对象会是null。正确做法是在Razor页面中通过组件标签引用:<RadzenTabs> <RadzenTabsItem Text="列表">...</RadzenTabsItem> <RadzenTabsItem Text="编辑"> <TestVS @ref="selectedSchedule" /> </RadzenTabsItem> </RadzenTabs>代码中仅声明引用,无需手动new:
private TestVS? selectedSchedule;同时确认
TestVS组件内的注入属性已标记[Inject]:[Inject] private IVesselData vesselData { get; set; } = null!;定位空引用的具体对象
扩大LoadVessel方法的调试范围,明确null对象:public async Task LoadVessel() { try { if(vesselData == null) { LogError(new NullReferenceException("vesselData未注入")); return; } if (VesselLoadId > 0) { vesselLoad = await vesselData.GetVesselLoadById(VesselLoadId); LogInformation($"查询结果:vesselLoadId={(vesselLoad?.VesselLoadId ?? 0)}"); } } catch (Exception ex) { LogError(ex); } if(vesselLoad == null) { LogWarning("vesselLoad为null,可能数据库无对应数据"); } StateHasChanged(); }同时检查
TestVS的Razor代码,所有绑定vesselLoad属性的地方需加null保护:<!-- 错误写法:直接绑定可能触发空引用 --> <RadzenTextBox @bind-Value="@vesselLoad.VesselName" /> <!-- 正确写法:使用空合并运算符 --> <RadzenTextBox @bind-Value="@(vesselLoad?.VesselName ?? string.Empty)" />修正async void方法的潜在风险
EditVessel使用async void时,Blazor无法正确捕获其异常,可能导致隐性错误。改为async Task:private async Task EditVessel(VesselListItem vessel) { if(selectedSchedule == null) return; selectedSchedule.VesselLoadId = vessel.VesselLoadId; await selectedSchedule.LoadVessel(); tabsSelectedIndex = 1; }检查Radzen标签页的渲染模式
RadzenTabs默认可能销毁未激活标签页的组件实例,导致selectedSchedule引用失效。可设置RenderMode保持组件实例:<RadzenTabs RenderMode="RenderMode.Server"> <!-- 标签页内容 --> </RadzenTabs>处理数据库查询返回null的场景
如果GetVesselLoadById返回null(数据库无对应数据),vesselLoad为null会触发UI绑定异常。在LoadVessel中初始化空对象:if (VesselLoadId > 0) { vesselLoad = await vesselData.GetVesselLoadById(VesselLoadId) ?? new VesselLoad(); }
内容的提问来源于stack exchange,提问作者Mark Bonafe
相关产品推荐
相关产品推荐

