ASP.NET Core MVC中身份页面的路由本地化实现问题
解决ASP.NET Core MVC身份页面路由本地化问题
你遇到的核心问题是:脚手架生成的Identity页面基于Razor Pages实现,但你的现有路由配置只覆盖了MVC控制器的路由规则,没有对Razor Pages的路由做本地化适配。下面是具体的分步解决方案:
1. 调整ConfigureServices中的服务配置
首先要为Identity的Razor Pages路由添加culture前缀,同时确保本地化服务能作用于Razor Pages:
services.AddLocalization(options => options.ResourcesPath = "Resources"); // 配置Identity服务,指定UI框架(根据你的项目实际情况调整) services.AddDefaultIdentity<IdentityUser>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultUI(UIFramework.Bootstrap4); services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_1) .AddViewLocalization() .AddDataAnnotationsLocalization(); // 为Identity区域的Razor Pages路由添加culture前缀 services.Configure<RazorPagesOptions>(options => { options.Conventions.AddAreaFolderRouteModelConvention("Identity", "/Account/", model => { foreach (var selector in model.Selectors) { var attributeRouteModel = selector.AttributeRouteModel; // 将culture参数插入到Identity页面路由的最前面 attributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{culture=en}", attributeRouteModel.Template); } }); });
2. 更新Configure中的路由中间件配置
修改路由逻辑,让Razor Pages和MVC页面共享带culture的路由规则,同时确保请求本地化中间件能作用于所有请求:
IList<CultureInfo> supportedCultures = new List<CultureInfo> { new CultureInfo("en"), new CultureInfo("fr"), }; var localizationOptions = new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("en"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures }; var requestProvider = new RouteDataRequestCultureProvider(); localizationOptions.RequestCultureProviders.Insert(0, requestProvider); app.UseRouter(routes => { routes.MapMiddlewareRoute("{culture=en}/{*all}", subApp => { subApp.UseRequestLocalization(localizationOptions); // 先注册Razor Pages路由(优先处理Identity页面) subApp.UseRazorPages(); // 再注册MVC控制器路由 subApp.UseMvc(mvcRoutes => { mvcRoutes.MapRoute( name: "areaRoute", template: "{culture=en}/{area:exists}/{controller=Home}/{action=Index}/{id?}"); mvcRoutes.MapRoute( name: "default", template: "{culture=en}/{controller=Home}/{action=Index}/{id?}"); }); }); });
3. 修正Identity页面的链接生成逻辑
默认的Identity页面链接(比如登录、注册跳转)不会自动携带culture参数,需要手动修改Razor页面中的链接代码:
比如在Register.cshtml或Login.cshtml中,将原有链接:
<a asp-area="Identity" asp-page="/Account/Login">Login</a>
修改为携带当前culture参数的版本:
<a asp-area="Identity" asp-page="/Account/Login" asp-route-culture="@Context.Request.RouteValues["culture"]">Login</a>
如果觉得每个链接都手动添加太繁琐,也可以在项目的_ViewImports.cshtml中封装一个自定义Tag Helper,或者通过ViewBag全局传递当前culture值,简化链接生成。
4. 验证效果
现在你可以尝试访问以下URL,应该都能正常打开对应语言的身份页面:
https://localhost:5001/en/Identity/Account/Registerhttps://localhost:5001/fr/Identity/Account/Register
同时请求本地化中间件会自动识别URL中的culture参数,加载对应的语言资源。
内容的提问来源于stack exchange,提问作者Roel Geusens
相关产品推荐
相关产品推荐

