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



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

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

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

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

提前谢谢。

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

我已经把这个包裹在一个新的包裹里了

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

更新:

从那时起,情况发生了变化,虽然仍然没有用于检测这一点的api,但在调用OnAfterRender/OnAfterRender sync后,您应该只执行外部调用(如JSInterop和HTTP调用(。

如果坚持这种模式,就不需要了解预渲染状态。

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

如果是服务器渲染,可以检查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是什么。因此,你不能依赖它。有时它会起作用,有时不会。

如果有很多流量,HttpContext可能会引用其他一些不相关的请求。

要检测Blazor服务器上的预渲染,我建议根据官方文档采取行动,这里引用:

Blazor服务器应用程序预呈现其内容时会调用OnInitializedAsync两次:

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

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

要防止OnInitializedAsync中的开发人员代码运行两次,请参阅预提交后的Stateful重新连接部分。

我正在添加静态布尔字段">ClientClass.PrerenderMode=false";到SomeClient类

A有

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

客户端未设置bool。

在服务器上">_主机.cshtml";@{ ClientClass.PrerenderMode = true; }

PS:如果你有Blazor Webassembly 的网络核心服务器

相关内容

  • 没有找到相关文章