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

Blazor(.NET8)中第二次OnInitializedAsync如何获取[CascadingParameter]?

Blazor .NET 8 中InteractiveServer渲染模式下OnInitializedAsync()两次调用及级联参数为空问题

当Blazor(.NET 8)设置为:

<Routes @rendermode="@RenderMode.InteractiveServer"/>

时,OnInitializedAsync()会被调用两次。第二次调用时,所有[CascadingParameter]均为null,但我需要使用这些参数。请问如何在第二次调用中获取这些参数?是否需要在第一次调用时保存参数以供第二次使用?有没有设置能让参数保留值?另外出于好奇,Blazor为何先设置参数再将其置空?

说明:以下MrC和Ruikai的回答均为我认可的答案,分别解答了问题的不同部分,请将这两个回答视为“已选中”。


MrC的回答

  • 禁用预渲染解决两次调用问题:可以修改Routes的渲染模式配置,禁用预渲染,这样OnInitializedAsync()只会执行一次,级联参数也能正常保留。配置代码如下:
    <Routes @rendermode="new InteractiveServerRenderMode(prerender: false)"/>
    
    禁用预渲染后,组件直接以交互式模式初始化,跳过了静态预渲染阶段,自然不会出现两次调用的情况。
  • 保留预渲染时的参数处理:如果必须使用预渲染,需要在第一次调用(预渲染阶段)将级联参数存储到本地变量或全局状态容器中。比如注入一个自定义的状态服务,在第一次OnInitializedAsync()里把参数存进去,第二次调用时从服务中读取即可。

Ruikai的回答

  • 两次调用及参数置空的原因:第一次调用属于预渲染阶段,Blazor会在服务器端生成静态HTML并发送给客户端,此时会初始化组件并设置级联参数;第二次调用是交互式连接建立后的组件重新初始化——预渲染的静态组件和后续的交互式组件是两个独立实例,预渲染实例的参数不会自动传递给交互式实例,所以第二次初始化时级联参数为null。这种设计是为了平衡首屏加载速度和交互性:用户先看到预渲染的静态内容,后台同时建立交互式连接,完成后再替换为可交互的组件。

内容的提问来源于Stack Exchange,提问作者David Thielen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:22:11