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

Blazor子组件按钮禁用:父组件回调完成后重新启用方案

解决Blazor子组件提交按钮禁用不生效的问题

问题根源

  1. 子组件的OnSubmit是同步方法,设置_isFormDisabled = true后,未等待EventCallback执行完成就立刻将其设回false,导致UI没有足够时间更新按钮状态。
  2. 父组件的GetCacheMemoryUsages是同步耗时方法,会阻塞UI线程,进一步阻止按钮状态的及时渲染。

修复步骤

1. 修改子组件代码,将OnSubmit改为异步方法

需要等待EventCallback执行完成后再恢复按钮状态,同时显式触发UI更新确保状态生效:

<RadzenTemplateForm TItem="SearchInputModel" Data=@_model Submit=@OnSubmit>
    <div class="col-sm-2 p-3">
        <RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Region Version</RadzenText>
        <RadzenTextBox @bind-Value=@_model.RegionVersion class="w-100" />
    </div>
    <div class="col-sm-2 pt-5">
        <RadzenButton Variant="Variant.Flat" Text="Search" ButtonType="ButtonType.Submit" ButtonStyle="ButtonStyle.Dark" Disabled="@_isFormDisabled" />
    </div>
</RadzenTemplateForm>

@code
{
    bool _isFormDisabled;
    SearchInputModel _model = new();

    [Parameter]
    public EventCallback<SearchInputModel> OnSearchClickEventCallback { get; set; }

    async Task OnSubmit(SearchInputModel model)
    {
        _isFormDisabled = true;
        StateHasChanged();
        
        try
        {
            await OnSearchClickEventCallback.InvokeAsync(model);
        }
        finally
        {
            _isFormDisabled = false;
            StateHasChanged();
        }
    }
}

2. 修改父组件的耗时方法为异步(推荐)

同步耗时方法会阻塞UI线程导致页面无响应,建议改为异步实现:

<ChildComponent OnSearchClickEventCallback="@GetCacheMemoryUsages"></ChildComponent>

@code
{
    IEnumerable<CacheKeyMemoryUsage> _cacheKeyMemoryUsages = new List<CacheKeyMemoryUsage>();

    private async Task GetCacheMemoryUsages(SearchInputModel model)
    {
        // 把CPU密集型耗时操作放入后台线程
        await Task.Run(() =>
        {
            // 执行原耗时操作代码
            // 若需更新组件状态,需通过InvokeAsync确保在UI线程执行
        });
    }
}

若父组件方法无法改为异步的兼容方案

如果必须保留同步方法,可通过Task.Run将其放入后台线程,避免阻塞UI:

private async Task GetCacheMemoryUsages(SearchInputModel model)
{
    await Task.Run(() =>
    {
        // 原同步耗时操作代码
    });
    // 更新UI状态需调用InvokeAsync
    await InvokeAsync(StateHasChanged);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:17:50