NavigateTo上的NavigationError

时间:2019-09-24 09:07:07

标签: 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;
}

}

但是总是在调用“ 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"

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

7 个答案:

答案 0 :(得分:7)

旧帖子,但是-如果您正在运行Blazor Server应用程序,则仅在render-mode为“ ServerPrerendered”时才会发生此行为。通过将模式更改为“服务器”来禁用预渲染,这样一来就不会引发异常:

<app>
    <component type="typeof(App)" render-mode="Server" />
</app>

我已经搜索了最新的Blazor文档并进行了更改说明,但没有发现任何提及,因此以防万一它可以帮助其他人...

答案 1 :(得分:7)

我需要将其放入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>

答案 2 :(得分:5)

此问题有一个open issue on github。另请参阅preceeding issue,其中提到了可能的解决方法:将NavigateTo方法而不是OnAfterRender放入OnInitialized

答案 3 :(得分:3)

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

protected override async Task OnInitializedAsync()
{
    NavigationManager.NavigateTo("Login");
}

这是我在路由中使用 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);
    }

}

在我的 App.razor 中

 <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                <NotAuthorized>
                    <RedirectToLogin />
                </NotAuthorized>
            </AuthorizeRouteView>
 </Found>

答案 4 :(得分:2)

当我尝试从另一个线程调用Navigationto时遇到了这个问题。 render-mode =“ Server”-解决了问题

答案 5 :(得分:1)

我遇到了同样的问题,提起issue #28355。官方的答案是,将NaviagteTo放在OnInitialized中时,可以忽略该异常。这是javiercn的答案:

是的,完全可以忽略它。调试器会停止,因为已对其进行了配置,但是在这种情况下,总是会处理异常。如果在调试器设置中捕获到该异常,则可以关闭该异常。

Issue #13582处理如何防止调试器在此异常时停止。

答案 6 :(得分:0)

在 .NET 5.0 中,在 _host.cshtml 文件中。在“blazor_error_ui”部分之后的行中粘贴以下@(await Html.RenderComponentAsync(RenderMode.Server))。