Asp.net core NavigateTo上的NavigationError
我正在试用Blazor服务器端,并创建了一个组件,在用户未登录时重定向到登录页面Asp.net core NavigateTo上的NavigationError,asp.net-core,blazor-server-side,Asp.net Core,Blazor Server Side,我正在试用Blazor服务器端,并创建了一个组件,在用户未登录时重定向到登录页面 @inject Microsoft.AspNetCore.Components.NavigationManager NavigationManager; @code { /// <inheritdoc /> protected override Task OnInitializedAsync() { NavigationManager.NavigateTo("Login"); retu
@inject Microsoft.AspNetCore.Components.NavigationManager NavigationManager;
@code {
/// <inheritdoc />
protected override Task OnInitializedAsync()
{
NavigationManager.NavigateTo("Login");
return Task.CompletedTask;
}
有趣的是,尽管有例外,还是进行了导航。
我还尝试使用路径“/login”调用它,但在这里的行为相同。此问题有一个解决方案。另请参见提到可能的解决方法的位置:将
导航到
方法放入OnAfterRender
而不是OnInitialized
旧帖子,但是-如果您正在运行Blazor服务器应用程序,只有在渲染模式为“ServerPrerendered”时才会发生此行为。通过将模式更改为“服务器”禁用预渲染,首先不会引发异常:
<app>
<component type="typeof(App)" render-mode="Server" />
</app>
我已经搜索了当前Blazor文档和更改注释,但没有发现任何关于此的内容,所以为了以防万一它对其他人有帮助…我在尝试从另一个线程调用navigateto时遇到了此问题。render mode=“Server”-解决了问题我需要将其放入
初始化
,而不是OnAfterRender
,因此必须使用render mode=“Server”
方法,尽管显然不建议这样做
它还在GitHub问题中指出,这只发生在调试中,而不是发布中,因此中间的一个选项是将\u 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>
我遇到了同样的问题并提交了文件。官方答案是,当
NaviagteTo
被置于OnInitialized
中时,忽略异常是可以保存的。以下是javiercn的答案:
是的,忽略它是完全安全的。调试器停止,因为它被配置为这样做,但在这种情况下,始终会处理异常。如果在调试器设置中捕获到此异常,则可以关闭对此异常的中断
处理如何防止调试器在此异常情况下停止。您还可以将方法更改为以下内容,包括在其签名中添加“async”关键字。可能会有人抱怨未使用wait,但作为交换,您不需要返回值。因为它没有“等待”,所以效果与同步版本差不多,但没有抛出异常
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);
}
}
在我的应用程序中
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeRouteView>
</Found>
在.NET 5.0中,在_host.cshtml文件中。在“blazor_error_ui”部分后的行中,通过以下@(等待Html.RenderComponentAsync(RenderMode.Server))。它可以工作,但它是一个“钉子的大锤”修复:-该问题不再开放,仍然没有解决,但是将调用移动到OnAfterRender
会很有魅力!这一定是我见过的最糟糕(最不具描述性)的例外之一。GG微软。我认为这是首选的解决方案,直到它被修复!我认为更好的解决方案是在代码中设置一个标志,然后在渲染完成后在预期的位置执行导航。您可以使用相同的标志来优化场景中的渲染。
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeRouteView>
</Found>