由于 dani herrera 的评论而更新:
生命周期方法 OnInitializedAsync 被调用两次,但计数器 @page 组件仅被调用一次。此行为是设计使然。第一次执行 OnInitializedAsync 是在服务器端 Blazor 应用程序正在预渲染时,在此期间,JSInterop 不可用,因此调用UriHelper.NavigateTo("/counter");会触发错误。以下代码片段描述了 Blazor 当前如何处理此类情况:
protected override void NavigateToCore(string uri, bool forceLoad)
{
Log.RequestingNavigation(_logger, uri, forceLoad);
if (_jsRuntime == null)
{
var absoluteUriString = ToAbsoluteUri(uri).ToString();
throw new NavigationException(absoluteUriString);
}
_jsRuntime.InvokeAsync<object>(Interop.NavigateTo, uri, forceLoad);
}
在这里查看更多。正如您可能意识到的,计数器@page 组件没有被调用,并且引发了异常。
预渲染完成后,客户端 SignalR 建立与服务器的连接,并渲染您的应用程序。这一次(第二次调用 OnInitializedAsync 方法)UriHelper.NavigateTo("/counter");正确执行,我们愉快地导航到计数器页面(第一次)
您可以使用 OnAfterRender 方法作为解决方法,并且您应该验证 SignalR 是否已经建立了与服务器的连接;即预渲染过程已经完成。
@page "/"
@using Microsoft.JSInterop
@inject IComponentContext ComponentContext
@inject IJSRuntime jsRuntime
<p>Navigate to the counter component.</p>
@code{
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (!ComponentContext.IsConnected) return;
UriHelper.NavigateTo("/counter");
}
}
希望这可以帮助...