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

如何避免Blazor SSR组件OnInitialized方法中业务逻辑重复执行?

Blazor预渲染时OnInitialized重复执行问题及后续疑问

原始问题

开启预渲染时,Blazor SSR组件的OnInitialized方法会执行两次。我将加载数据库产品列表这类业务逻辑写在该方法中,想知道如何避免其重复执行?是否必须用IsInitialized这类本地变量跟踪执行状态?Blazor有没有内置检测机制?或者是否需要将业务逻辑移至其他生命周期方法?

9/23 更新:补充代码说明问题

已尝试@Rena的第4种方案,但未达到预期效果。所有组件继承自BaseComponent,我需要在其中获取登录用户信息,因此在OnInitialized方法中调用获取用户上下文的方法,希望该逻辑仅执行一次。目前GetUserContextFromAuthenticationState和GetProductsListFromDatabase均执行两次,isInitialized始终为false。

应用配置:

  • App.razor未指定渲染模式,以静态服务器渲染模式启动
  • BaseComponent指定为交互式服务器渲染模式

BaseComponent.razor

@rendermode InteractiveServer
@code {
    private bool isInitialized = false;
    protected override async Task OnInitializedAsync()
    {
        if (!isInitialized)
        {
            var user = GetUserContextFromAuthenticationState();
            isInitialized = true;
        }
    }
}

Products.razor

@inherits BaseComponent
@code {
    private bool isInitialized = false;
    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync().ConfigureAwait(false);
        if (!isInitialized)
        {
            var products = GetProductsListFromDatabase();
            isInitialized = true;
        }
    }
}

9/24 更新:已解决部分问题

使用IHttpContextAccessor.HttpContext检测预渲染的方案可行(@Rena的第2种答案),已标记为正确答案。

后续疑问

但我想知道上述代码无效的原因:Blazor组件是否会被实例化两次?这是否是isInitialized始终为false的原因?是否需要单独提问?我花费了大量时间理解Blazor组件生命周期,但仍有困惑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:51:03