Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core NavigateTo上的NavigationError_Asp.net Core_Blazor Server Side - Fatal编程技术网

Asp.net core NavigateTo上的NavigationError

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

我正在试用Blazor服务器端,并创建了一个组件,在用户未登录时重定向到登录页面

@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>