Blazor StateHasChanged 在自定义事件处理程序中不起作用

Blazor StateHasChanged not working in custom eventhandler

提问人:enderaric 提问时间:4/26/2023 更新时间:4/27/2023 访问量:205

问:

我有一个事件处理程序,它将模型触发到 blazor 中的另一个组件。

public class NotifyStateService
{
    public event EventHandler<CascadingItemEventArgs>? UpdateSubDropdownEvent;

    public void NotifySubDropdown(object sender, CascadingItemEventArgs e)
    {
        if (this.UpdateSubDropdownEvent != null)
            UpdateSubDropdownEvent(sender, e);
    }
}

public class CascadingItemEventArgs : EventArgs
{
    private CascadingDropdownModel _model;
    public CascadingItemEventArgs(CascadingDropdownModel model)
    {
        _model = model;
    }

    public CascadingDropdownModel CascadingModel
    {
        get
        {
            return _model;
        }
        set
        {
            _model = value;
        }
    }
}

当我调用我的通知时,它可以正常工作,我可以从中获取值。然后我就可以做我的工作了。但它不会通过 StateHasChanged() 方法更改 UI。

private async void UpdateSubDropdown(object sender,CascadingItemEventArgs  e)
    {
        if (BaseId.HasValue && HtmlName == e.CascadingModel.EffectiveId)
        {
            Regions = Task.Run(() => _apiClient.GetServiceResultAsync<UserRegionModel[]>($"UserRegion/GetByBaseId/{e.CascadingModel.Value}", Token)).GetAwaiter().GetResult();
            await InvokeAsync(() => StateHasChanged());
        }
    }

在组件的前端,我需要显示新区域,但我不能。我做了很多测试,但需要找到合适的方法。

注意:区域填充正确。

C# asp.net 事件 blazor blazor-server-side

评论

1赞 ℍ ℍ 4/26/2023
“区域正在正确填充”表示这部分代码工作正常。但是我们看不出它如何适合您的 UI。
0赞 enderaric 4/26/2023
@HH是的。我在UI中看不到这些区域
0赞 ℍ ℍ 4/27/2023
我的意思是,这个任务缺乏正确的细节,不太可能在这里得到答案。考虑设置一个最小的可重现示例

答:

0赞 MrC aka Shaun Curtis 4/27/2023 #1

事件处理程序应如下所示:

private async void UpdateSubDropdown(object sender,CascadingItemEventArgs  e)
    {
        if (BaseId.HasValue && HtmlName == e.CascadingModel.EffectiveId)
        {
            Regions = await _apiClient.GetServiceResultAsync<UserRegionModel[]>($"UserRegion/GetByBaseId/{e.CascadingModel.Value}", Token));
            this.InvokeAsync(StateHasChanged);
        }
    }

除非您是异步专家,否则请保持简单。

如果这不起作用,您能向我们展示一个最小的可重复示例吗?你是怎么展示的?Regions

评论

0赞 ℍ ℍ 4/27/2023
这是一个改进,但并不重要,“区域正在正确填充”。await
0赞 ℍ ℍ 4/27/2023
而且 Task.Run() 没有受到伤害,这是针对 Blazor Server 的。
0赞 MrC aka Shaun Curtis 4/27/2023
在所有观点上都达成一致,但我们认为这是服务器的唯一原因是因为 OP 选择了标签。 看起来它正在进行 API 调用,所以我不太确定。并且可以杀死您的应用程序!我现在只是在钓鱼,因为 OP 并没有给我们太多可以继续前进的机会。blazor-server-sideGetServiceResultAsync<UserRegionModel[]>($"UserRegion/GetByBaseId/{e.CascadingModel.Value}".GetResult()