.NET 9 Blazor Server应用NavigationManager跳转认证页面失败如何解决?
问题原因
Blazor Server的NavigationManager.NavigateTo默认仅处理Blazor组件路由(.razor页面),而独立账户模块的/Account/Login等页面属于Razor Pages(纯服务器端路由页面,非Blazor组件)。当直接调用NavigateTo("/Account/Login")时,Blazor会先在客户端路由表中匹配,找不到对应路由就返回404;但浏览器地址栏直接访问时,请求会直接发送到服务器,由Razor Pages路由处理,因此能正常访问。
解决方案
方案1:强制全页面刷新跳转
使用NavigateTo的重载方法,传入forceLoad: true参数,强制浏览器发起全页面请求,交由服务器端路由处理:
// Page1.razor中的按钮点击逻辑 private void GoToLogin() { NavigationManager.NavigateTo("/Account/Login", forceLoad: true); }
方案2:配置Blazor路由忽略特定路径(更优雅)
在Program.cs中添加路由忽略规则,让Blazor不处理/Account开头的请求,直接交给服务器默认路由处理:
var builder = WebApplication.CreateBuilder(args); // 省略其他服务注册代码... var app = builder.Build(); // 省略中间件配置代码... app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); // 添加路由忽略规则:让服务器处理Account路径下的所有请求 app.MapWhen(ctx => ctx.Request.Path.StartsWithSegments("/Account"), _ => { }); app.Run();
配置完成后,直接调用NavigationManager.NavigateTo("/Account/Login")即可正常跳转,无需强制刷新。
验证
测试跳转/Account/Login、/Account/Register等Razor Pages页面,均不会再出现404错误,功能与直接访问URL一致。
内容的提问来源于stack exchange,提问作者Norbert B.
相关产品推荐
相关产品推荐

