在 Blazor 服务器应用程序中检测服务器预渲染

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

是否有任何方法可以通过

OnInitializedAsync
生命周期方法检测 Blazor 组件中是否正在进行预渲染?我知道组件工作流程会调用
OnInitializedAsync
两次,第一次用于预渲染,第二次用于实际渲染。最后一次性调用
OnAfterRenderAsync
方法进行实际渲染。

但是,我需要检测

OnInitializedAsync
中的预渲染。这样我就可以在预渲染中进行一些更改并在实际渲染中阻止它,反之亦然。

我检查了下面的 GitHub 问题,但没有有效的解决方案。我希望,它应该在像

IsPrerendering
这样的 API 中得到解决。

https://github.com/dotnet/aspnetcore/issues/17282

提前致谢。

blazor blazor-server-side prerender
5个回答
5
投票

没有内置API,但您可以使用HTTP上下文来检测它。

我已将其包装在 nuget 包中

https://www.nuget.org/packages/PreRenderComponent

更新:

从这次开始,情况发生了变化,虽然仍然没有 api 来检测这一点,但您应该只在调用 OnAfterRender/OnAfterRenderAsync 后执行外部调用(例如 JSInterop 和 HTTP 调用)。

如果您坚持这种模式,则无需了解预渲染状态。


4
投票

您可以使用 IHttpContextAccessor.HttpContext.Response.HasStarted 属性来检查应用程序是否正在预渲染。 HasStarted 指定响应标头已发送到客户端。如果 HasStarted 设置为 false,则表示应用程序仍在预渲染,尚未建立客户端连接。


0
投票

如果是服务器渲染,您可以检查javascript是否可用。

public static bool IsPreRendering(this IJSRuntime runtime)
{
    // The peculiar thing in prerender is that Blazor circuit isn't yet created, so we can't use JSInterop
    return !(bool)runtime.GetType().GetProperty("IsInitialized").GetValue(runtime);
}

接受的响应(使用 HttpContextAccessor)是一个糟糕的建议。无法保证预渲染和渲染后的 HttpContext 是什么。因此,您不能依赖它。有时会起作用,有时则不起作用。


-1
投票

要检测 Blazor 服务器上的预渲染,我建议按照官方文档进行操作,这里是引用:

预渲染其内容的 Blazor 服务器应用程序调用 OnInitializedAsync 两次:

  • 当组件最初作为页面的一部分静态呈现时。

  • 当浏览器第二次建立与服务器的连接时。

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


-1
投票

我正在向 SomeClient 类添加静态布尔字段“ClientClass.PrerenderMode = false

  • 主机(取决于:客户端)
  • 共享
  • 客户

客户端未设置布尔值。

在服务器“_Host.cshtml”上

@{ ClientClass.PrerenderMode = true; }

PS:如果您有带有 Blazor Web assembly 的网络核心服务器

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