ASP.NET Core Tag Helper生成链接忽略当前文化,始终跳转至塞尔维亚语求助
嘿,我之前也踩过Tag Helper本地化跳转的坑,结合你描述的情况,大概率是这几个地方没处理好,咱们一步步来搞定:
你贴的代码没写完,首先得确保SupportedUICultures也被正确赋值——很多人会漏掉这个,但本地化需要同时配置SupportedCultures和SupportedUICultures,否则很容易出现默认文化异常:
var supportedCultures = new List<CultureInfo> { new CultureInfo("sq-AL"), new CultureInfo("en-US"), new CultureInfo("sr-Latn-RS") }; var localizationOptions = new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("sq-AL"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures // 这个必须加上! };
还要记得把配置注册到服务,并且在管道里启用,最好加上文化提供器来指定获取文化的优先级(比如从URL、Cookie、请求头):
services.Configure<RequestLocalizationOptions>(options => { options.DefaultRequestCulture = new RequestCulture("sq-AL"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; // 配置文化获取方式的优先级,按需调整顺序 options.RequestCultureProviders = new List<IRequestCultureProvider> { new QueryStringRequestCultureProvider(), // 从?culture=xx参数获取 new CookieRequestCultureProvider(), // 从Cookie获取 new AcceptLanguageHeaderRequestCultureProvider() // 从浏览器请求头获取 }; }); // 在Configure/Program.cs的管道中启用,注意要放在UseRouting之前 app.UseRequestLocalization(app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);
Tag Helper要生成带文化的链接,必须让路由模板支持{culture}参数,否则它不知道该把文化信息加到哪里,可能会默认跳转到某个错误的文化。比如在路由配置里:
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{culture}/{controller=Home}/{action=Index}/{id?}"); });
如果是切换文化的链接,要明确在Tag Helper里指定asp-route-culture参数,否则它会沿用当前请求的文化(如果当前请求文化被意外设置成sr-Latn-RS,就会一直跳过去):
<a asp-action="Index" asp-route-culture="sq-AL">阿尔巴尼亚语</a> <a asp-action="Index" asp-route-culture="en-US">English</a> <a asp-action="Index" asp-route-culture="sr-Latn-RS">Srpski</a>
有时候浏览器Cookie里保存了之前的sr-Latn-RS文化设置,会覆盖你配置的默认sq-AL。可以先清空浏览器的Cookie,或者在测试时暂时禁用CookieRequestCultureProvider,看看是否能恢复正常。
确认sr-Latn-RS是正确的文化名称,拼写错误会导致系统无法识别,进而回退到某个默认文化。你可以用CultureInfo.GetCultures(CultureTypes.AllCultures)枚举所有可用文化,检查这个名称是否存在。
UseRequestLocalization必须放在其他可能修改请求文化的中间件之前执行,否则后面的中间件可能会覆盖你设置的文化。比如要确保它在UseMvc或UseEndpoints之前。
内容的提问来源于stack exchange,提问作者user9384820

