You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

关键修改点

  1. 将model的初始化移至OnInitializedAsync,这是组件初始化数据的合适时机,避免渲染后再更新导致额外重渲染。
  2. 使用Mediator.Subscribe替代实现INotificationHandler,确保当前UI组件实例接收并处理通知。
  3. 实现IDisposable接口,在组件销毁时取消订阅,防止内存泄漏。

内容的提问来源于stack exchange,提问作者Orangesooda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:58:03