You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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/Register
  • https://localhost:5001/fr/Identity/Account/Register

同时请求本地化中间件会自动识别URL中的culture参数,加载对应的语言资源。

内容的提问来源于stack exchange,提问作者Roel Geusens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:47:46