如何将ASP.NET MVC的MvcRouteHandler适配到ASP.NET Core MVC?
在ASP.NET Core中集成自定义IRouter实现的CulturalRouteHandler
下面是两种直接可行的集成方式,帮你把自定义的CulturalRouteHandler关联到指定的文化路由:
方法1:直接在端点路由中指定自定义Handler
在Program.cs的端点配置里,直接给目标路由指定你的IRouter实例即可。这种方式最直接,适合大多数场景。
var builder = WebApplication.CreateBuilder(args); // 注册MVC服务和你的自定义Handler(如果有依赖注入需求) builder.Services.AddControllersWithViews(); builder.Services.AddScoped<CulturalRouteHandler>(); // 根据实际生命周期调整 var app = builder.Build(); // 常规中间件配置 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { // 从服务容器获取自定义Handler实例 var culturalHandler = endpoints.ServiceProvider.GetRequiredService<CulturalRouteHandler>(); // 映射带文化参数的路由,并关联自定义Handler endpoints.MapRoute( name: "culture", template: "{culture:regex(^[a-z]{2}-[A-Z]{2}$)}/{controller}/{action}/{id?}", defaults: new { controller = "Home", action = "Index" }, constraints: new { culture = new CultureRouteConstraint() }, // 可选,验证文化格式 router: culturalHandler ); // 保留默认路由 endpoints.MapControllerRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}" ); }); app.Run();
方法2:用RouteBuilder构建自定义路由集合
如果需要更灵活的路由组合(比如批量添加多个关联该Handler的路由),可以用RouteBuilder来构建路由,再添加到端点。
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); builder.Services.AddScoped<CulturalRouteHandler>(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { var routeBuilder = new RouteBuilder(endpoints); var culturalHandler = endpoints.ServiceProvider.GetRequiredService<CulturalRouteHandler>(); // 添加文化路由并绑定Handler routeBuilder.MapRoute( name: "culture", template: "{culture:regex(^[a-z]{2}-[A-Z]{2}$)}/{controller}/{action}/{id?}", handler: culturalHandler ); // 构建路由并添加到端点 var customRoutes = routeBuilder.Build(); endpoints.Map(customRoutes); // 默认路由 endpoints.MapControllerRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}" ); }); app.Run();
重要注意事项
- 确保你的
CulturalRouteHandler正确实现IRouter的两个核心方法:RouteAsync(负责解析路由、设置当前文化)和GetVirtualPath(负责生成带文化参数的URL)。 - 如果需要验证文化参数的格式,自定义一个实现
IRouteConstraint的CultureRouteConstraint类,在路由配置中指定即可。 - 若
CulturalRouteHandler依赖其他服务(比如IStringLocalizer、IHttpContextAccessor),必须先在builder.Services中注册这些依赖,再注册Handler本身,否则无法通过服务容器获取实例。
内容的提问来源于stack exchange,提问作者zSynopsis
相关产品推荐
相关产品推荐

