InteractiveServer/Wasm模式下IHxMessageBoxService注入失败求助
解决Havit Blazor IHxMessageBoxService在非Auto渲染模式下的空引用异常
问题说明
迁移到Havit Blazor组件后,在InteractiveServer或InteractiveWebAssembly渲染模式(未启用Auto模式)下,注入IHxMessageBoxService后调用ShowAsync()会触发NullReferenceException,提示MessageBox实例为null。
问题根源
Havit Blazor的HxMessageBoxHost需要和调用服务的组件处于相同渲染模式上下文,非Auto模式下如果HxMessageBoxHost未正确关联到对应渲染模式的组件树,服务找不到宿主实例,就会导致注入的服务为空。
修复方案
1. 修正服务注册逻辑
- 独立WebAssembly项目:仅在客户端Program.cs中注册服务:
builder.Services.AddHxServices(); builder.Services.AddHxMessenger(); builder.Services.AddHxMessageBoxHost();
- 托管式Blazor Web App:
- 服务器端Program.cs:仅注册基础框架服务,无需添加UI相关服务:
builder.Services.AddHxServices(); - 客户端Program.cs:注册完整UI相关服务:
builder.Services.AddHxMessenger(); builder.Services.AddHxMessageBoxHost();
- 服务器端Program.cs:仅注册基础框架服务,无需添加UI相关服务:
2. 为HxMessageBoxHost指定渲染模式
在布局文件中,明确给HxMessageBoxHost设置与当前页面一致的渲染模式,确保服务能找到宿主实例:
@inherits LayoutComponentBase <!-- 根据实际使用的渲染模式二选一 --> <HxMessageBoxHost @rendermode="InteractiveServer" /> <!-- 或 --> <HxMessageBoxHost @rendermode="InteractiveWebAssembly" /> <!-- Messenger组件也需同步指定对应渲染模式 --> <HxMessenger Position="ToastContainerPosition.TopEnd" @rendermode="InteractiveServer" />
3. 确认服务注入方式
组件中必须通过依赖注入获取IHxMessageBoxService,禁止使用静态实例:
@inject IHxMessageBoxService MessageBox <button @onclick="ShowTestMessageBox">显示测试弹窗</button> @code { private async Task ShowTestMessageBox() { await MessageBox.ShowAsync("标题", "这是一条测试消息"); } }
4. 保证组件树渲染模式一致性
调用ShowAsync()的组件,必须和HxMessageBoxHost处于同一渲染模式的组件层级中。例如页面使用@rendermode="InteractiveServer",布局中的HxMessageBoxHost也必须指定相同的渲染模式,不能混合不同渲染模式的组件。
额外检查项
- 删除项目的bin/obj目录,重新构建解决方案,避免旧编译文件引发的异常。
- 确认Havit Blazor 4.7.2与.NET 9.0的兼容性,若问题仍存在,可尝试升级到最新版本的Havit组件。
内容的提问来源于stack exchange,提问作者DrXSsive
相关产品推荐
相关产品推荐

