如何防止 Blazor SSR 组件的 OnInitialized 方法中存在的业务逻辑执行两次?

问题描述 投票:0回答:1

据我了解,如果启用预渲染,Blazor SSR 组件的 OnInitialized 方法会执行两次。我已经在 OnInitialized 方法中编写了业务逻辑,例如从数据库加载所有产品。如何防止业务逻辑执行两次?我是否必须使用局部变量(例如 IsInitialized = false)来跟踪它,然后在业务逻辑执行后将其设置为 true? Blazor 是否有内置方法来检测此问题?或者我应该将业务逻辑转移到不同的生命周期方法?

asp.net-core blazor-server-side .net-8.0
1个回答
0
投票

我们可以通过多种方式实现:

1.正如官方文档所说:

防止 OnInitializedAsync 中的开发人员代码运行两次 预渲染时,请参阅预渲染后有状态重新连接部分

2.您可以使用

IHttpContextAccessor.HttpContext.Response.HasStarted
属性来检查应用程序是否预渲染。

@code{
    [Inject]
    protected IHttpContextAccessor httpContextAccessor { get; set; }
    
    protected override async Task OnInitializedAsync()
    {
        var isPreRendering = !this.httpContextAccessor.HttpContext.Response.HasStarted;
    
        if (!isPreRendering)
        {
            //call your service...
        }
            
    }
}

HttpContextAccessor
服务应通过调用
AddHttpContextAccessor
中的
Program.cs
方法来注册。

builder.Services.AddHttpContextAccessor();

3.如果您需要执行仅在组件完全渲染后运行一次的逻辑,请考虑使用

OnAfterRenderAsync
。但是,请小心,因为它会在每次渲染后运行。

@code{
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            //call your service here
        }
    }
}

4.正如您所说,您可以使用标志(如 IsInitialized)来跟踪业务逻辑是否已经执行。

@code {
    private bool isInitialized = false;

    protected override async Task OnInitializedAsync()
    {
        if (!isInitialized)
        {
            //call your Business logic 
            isInitialized = true;
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.