为何Blazor无法路由到Razor类库中的组件?
解决Razor类库中带@page路由的组件无法访问的问题
这是个很常见的坑——Razor类库(RCL)中的路由组件不会被Blazor主项目自动发现,这就是为什么你直接引用无路由的AccountNavigation.razor没问题,但带@page的Login.razor路由不生效的原因。
Blazor的路由系统默认只会扫描主项目的程序集来寻找路由组件,引用的RCL除非明确告诉主项目要扫描它的程序集,否则路由组件不会被注册。下面是具体的解决步骤:
步骤1:在RCL中添加路由注册扩展(可选但更优雅)
在你的Razor类库中新建一个静态类,比如RclRouteRegistration.cs,用来封装路由注册逻辑:
using Microsoft.AspNetCore.Components; using System.Reflection; namespace YourRclProjectNamespace // 替换成你的RCL实际命名空间 { public static class RclRouteRegistration { /// <summary> /// 注册RCL中的路由组件 /// </summary> public static IEndpointRouteBuilder MapRclRoutes(this IEndpointRouteBuilder endpoints) { // 告诉Blazor路由系统扫描当前RCL的程序集 endpoints.MapRazorComponents<App>() // App是主项目的根组件类 .AddAdditionalAssemblies(Assembly.GetExecutingAssembly()); return endpoints; } } }
步骤2:在主Blazor项目中注册RCL的路由
根据你的Blazor项目类型(Server/WebAssembly),在启动代码中添加路由扫描:
如果你用的是.NET 6+ Blazor Server/WebAssembly
在Program.cs中找到路由配置的部分,添加如下代码:
var app = builder.Build(); // ... 其他中间件配置(比如UseStaticFiles、UseRouting等) // 方案1:直接指定扫描RCL程序集 app.MapRazorComponents<App>() .AddAdditionalAssemblies(typeof(YourRclProjectNamespace.Login).Assembly); // 方案2:用我们刚才写的扩展方法更简洁 // app.MapRclRoutes(); app.Run();
如果你用的是.NET 5及以前的Blazor Server
在Startup.cs的Configure方法中,修改UseEndpoints部分:
app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); // 添加这行,扫描RCL程序集中的路由组件 endpoints.MapRazorComponents<App>() .AddAdditionalAssemblies(typeof(YourRclProjectNamespace.Login).Assembly); });
额外的配置优化建议
- 把RCL的目标框架改成和主项目一致的版本(比如主项目用.NET 6,RCL就设为
net6.0),netstandard2.1虽然兼容,但使用匹配的TFM能避免潜在的兼容问题。 - 移除RCL中不必要的包引用:比如
Microsoft.AspNetCore.Mvc.RazorPages对Blazor组件来说是多余的,你可以删掉这个引用,只保留Microsoft.AspNetCore.Components和Microsoft.AspNetCore.Components.Web即可。
这样修改后,主项目的路由系统就会扫描RCL的程序集,你的Login.razor的@page "/login"路由就能正常生效了,不管是通过链接访问还是手动输入地址都可以。
内容的提问来源于stack exchange,提问作者maraaaaaaaa
相关产品推荐
相关产品推荐

