Blazor筛选列表时触发空引用异常问题求助
问题分析与修复方案
核心问题
- 错误调用生命周期方法:你在
_selectedbrand的setter里直接调用了OnInitializedAsync()——这是Blazor框架专属的生命周期方法,手动触发会打乱组件初始化流程,可能导致viewModel或相关依赖未完成初始化就被调用,引发空引用异常。 - 缺失null校验:调用
UpdateBrand(viewModel)时,viewModel可能处于未初始化的null状态,直接传入会触发空引用。
修复步骤
1. 替换生命周期调用,改用自定义数据加载方法
创建独立的LoadBrandDataAsync()方法封装数据加载逻辑,替代直接调用OnInitializedAsync(),保证流程可控。
2. 完善null检查
在调用UpdateBrand前,先校验viewModel是否为null,避免空引用传递。
3. 调整属性setter逻辑
移除生命周期方法调用,改用自定义加载方法,同时强化空值判断。
修改后的代码示例
<MudSelect Value="@_selectedbrand" T="string" Label="Select Brand" Variant="Variant.Filled" ValueChanged="OnValueChanged" > @foreach (var item in brand) { <MudSelectItem Value="@item.Id">@item.Description</MudSelectItem> } </MudSelect> @code{ private string? selectedBrand; // 自定义数据加载方法,封装原OnInitializedAsync中的逻辑 private async Task LoadBrandDataAsync() { // 这里放置原OnInitializedAsync内的数据初始化、品牌列表获取等逻辑 } public string _selectedbrand{ get => selectedBrand; set { selectedBrand = value; if(brandTable is not null && viewModel is not null) { UpdateBrand(viewModel); await LoadBrandDataAsync(); brandTable.SetEditingItem(null); } } } protected override async Task OnInitializedAsync() { await LoadBrandDataAsync(); // 其他初始化逻辑 } }
额外建议
- 尽量避免在属性setter里执行异步操作或复杂状态变更,可考虑通过
ValueChanged事件处理筛选逻辑,代码可读性更高。 - 检查
UpdateBrand方法内部,确保访问viewModel属性前都做了null校验,避免内部触发空引用。
内容的提问来源于stack exchange,提问作者sayef4
相关产品推荐
相关产品推荐

