NavigateTo 上的 NavigationError

NPa*_*utt 10 asp.net-core blazor-server-side

我正在尝试 Blazor ServerSide 并创建了一个组件以在用户未登录时重定向到登录页面。

@inject Microsoft.AspNetCore.Components.NavigationManager NavigationManager;

@code {
/// <inheritdoc />
protected override Task OnInitializedAsync()
{
    NavigationManager.NavigateTo("Login");
    return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)

}

但总是在调用“NavigateTo”时抛出以下异常:

"Microsoft.AspNetCore.Components.NavigationException: Exception of type 'Microsoft.AspNetCore.Components.NavigationException' was thrown.
   at Microsoft.AspNetCore.Components.Server.Circuits.RemoteNavigationManager.NavigateToCore(String uri, Boolean forceLoad)
   at Microsoft.AspNetCore.Components.NavigationManager.NavigateTo(String uri, Boolean forceLoad)
   at ApplySupportTool.Blazor.Pages.RedirectToLogin.OnInitializedAsync() in C:\\Users\\padruttn\\Documents\\git\\ApplySupportTool\\src\\ApplySupportTool.Blazor\\Pages\\RedirectToLogin.razor:line 8"
Run Code Online (Sandbox Code Playgroud)

有趣的是,尽管有例外,还是进行了导航。我也尝试使用路径“/login”来调用它,但这里的行为相同。

Pas*_* R. 26

关于这个问题,github 上有一个未解决的问题。另请参阅前面提到的可能解决方法的问题:将NavigateTo方法放入OnAfterRender而不是OnInitialized.

  • 该问题已不再公开并且仍未解决,但将调用移至“OnAfterRender”会产生魅力! (8认同)

小智 12

使用 OnInitializedAsync 替换 OnInitialized

protected override async Task OnInitializedAsync()
{
    nav.NavigateTo("/login", true);
    await base.OnInitializedAsync();
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的解决方案 (3认同)

小智 10

我遇到了同样的问题并提交了问题#28355NaviagteTo官方的答案是,放在 中时忽略异常是可以保存的OnInitialized。以下是 javiercn 的回答:

是的,忽略它是完全安全的。调试器会停止,因为它被配置为这样做,但在这种情况下,异常总是被处理。如果调试器设置捕获到此异常,您可以关闭此异常的中断。

问题 #13582涉及如何防止调试器在此异常处停止。


ata*_*xia 9

我需要将其放入OnInitialized而不是OnAfterRender,因此必须采用该render-mode="Server"方法,尽管显然不推荐这样做。

它还在 GitHub 问题中指出,这只发生在调试中,而不是发布中,因此中间选项是更改_Host.cshtml为包含:

<environment include="Staging,Production">
    <component render-mode="ServerPrerendered" type="typeof(App)" />
</environment>
<environment include="Development">
    <component render-mode="Server" type="typeof(App)" />
</environment>
Run Code Online (Sandbox Code Playgroud)


小智 8

旧帖子,但是 - 如果您正在运行 Blazor 服务器应用程序,则此行为仅在渲染模式为“ServerPrerendered”时发生。通过将模式更改为“服务器”来禁用预渲染使异常不会首先抛出:

<app>
    <component type="typeof(App)" render-mode="Server" />
</app>
Run Code Online (Sandbox Code Playgroud)

我搜索了当前的 Blazor 文档和更改说明,但没有发现任何提及,所以以防万一它对其他人有帮助......

  • 它有效,但它是一个“大锤钉钉子”修复:-s (3认同)

Hyq*_*que 5

您还可以将您的方法更改为以下方法,包括其签名中的“async”关键字,将会有人抱怨不使用 await,但作为交换,您不需要返回值。由于它没有 'await' 效果与同步版本有点相同,但没有抛出异常。

protected override async Task OnInitializedAsync()
{
    NavigationManager.NavigateTo("Login");
}
Run Code Online (Sandbox Code Playgroud)

这是我在路由中使用 RedirectToLogin.razor 组件的示例

@inject NavigationManager NavigationManager

@code{

    protected override async Task OnInitializedAsync()
    {
        var returnUrl = "~/" + NavigationManager.ToBaseRelativePath(NavigationManager.Uri);
        NavigationManager.NavigateTo($"Identity/Account/Login?returnUrl={returnUrl}", forceLoad:false);
    }

}
Run Code Online (Sandbox Code Playgroud)

在我的 App.razor 中

 <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                <NotAuthorized>
                    <RedirectToLogin />
                </NotAuthorized>
            </AuthorizeRouteView>
 </Found>
Run Code Online (Sandbox Code Playgroud)