Blazor WASM中Mediator处理方法内模型与表单引用为空问题
Blazor WASM 表单验证中Mediator Handle方法内实例为空问题解决
问题原因
你的组件实现了INotificationHandler<ValidateRegistrationNotification>,但Mediator调用Handle方法时,使用的是DI容器创建的新组件实例,而非当前正在渲染的UI组件实例。新实例未经过Blazor的组件生命周期初始化,所以form和model均为null,而你在OnAfterRenderAsync中看到的是当前UI组件实例的变量值。
解决方案
不要让组件直接实现INotificationHandler,改为在组件内部通过Mediator的Subscribe方法订阅通知,确保当前UI组件实例处理通知:
修改后的代码
@inject IRegistrationService RegService @inject IMediator Mediator @implements IDisposable <MudForm Model="@model" @ref="form" Validation="@(validator.ValidateValue)"> </MudForm> @code { private MudForm? form { get; set; } private FormPersonalDetailModel? model { get; set; } private FormPersonalDetailValidator validator = new(); private IDisposable? _mediatorSubscription; protected override Task OnInitializedAsync() { // 提前初始化model,无需等到OnAfterRender model = RegService.Registration.FormPersonalDetail; // 订阅通知,绑定当前组件实例的处理方法 _mediatorSubscription = Mediator.Subscribe<ValidateRegistrationNotification>(HandleValidation); return base.OnInitializedAsync(); } private async Task HandleValidation(ValidateRegistrationNotification validate, CancellationToken cancellationToken) { if (validate.StageType == typeof(FormPersonalDetailModel)) { if (form == null) return; await form.Validate(); if (form.IsValid) { RegService.GoToNextStage(); } } } // 组件销毁时取消订阅,避免内存泄漏 public void Dispose() { _mediatorSubscription?.Dispose(); } }
关键修改点
- 将
model的初始化移至OnInitializedAsync,这是组件初始化数据的合适时机,避免渲染后再更新导致额外重渲染。 - 使用
Mediator.Subscribe替代实现INotificationHandler,确保当前UI组件实例接收并处理通知。 - 实现
IDisposable接口,在组件销毁时取消订阅,防止内存泄漏。
内容的提问来源于stack exchange,提问作者Orangesooda
相关产品推荐
相关产品推荐

