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”来调用它,但这里的行为相同。
小智 12
使用 OnInitializedAsync 替换 OnInitialized
protected override async Task OnInitializedAsync()
{
nav.NavigateTo("/login", true);
await base.OnInitializedAsync();
}
Run Code Online (Sandbox Code Playgroud)
我需要将其放入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 文档和更改说明,但没有发现任何提及,所以以防万一它对其他人有帮助......
您还可以将您的方法更改为以下方法,包括其签名中的“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)
| 归档时间: |
|
| 查看次数: |
8483 次 |
| 最近记录: |