我正在建立一个支持阿尔巴尼亚语,英语和塞尔维亚语的多语言网站,但是以某种方式,从标记帮助程序生成的所有链接都将继续重定向到塞尔维亚语。
这是我在StartUp.cs
中所拥有的:
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
};
var requestProvider = new RouteDataRequestCultureProvider();
localizationOptions.RequestCultureProviders.Insert(0, requestProvider);
app.UseRouter(routes =>
{
routes.MapMiddlewareRoute("{culture=sq-AL}/{*mvcRoute}", subApp =>
{
subApp.UseRequestLocalization(localizationOptions);
subApp.UseMvc(mvcRoutes =>
{
mvcRoutes.MapRoute(
name: "default",
template: "{culture=sq-AL}/{controller=Home}/{action=Index}/{id?}");
});
});
});
这是我在主导航菜单中拥有的操作链接:
<a asp-controller="Content" asp-action="About">@_localizer["nav_about"]</a>
它曾经很好地工作,我试图弄清楚为什么它不再起作用了,但到目前为止还没有任何想法。
有趣的是,所有标签都基于选定的区域性从资源文件中获取值,无论我切换到哪种区域性,链接都始终重定向到塞尔维亚语。从上面的标签帮助程序生成的链接:
http://localhost:50807/sr-Latn-RS/Content/About
。提交表单也是如此:无论当前选择的文化是什么,
<form asp-controller="Account" asp-action="RegisterProfile" method="post">
都会结果为http://localhost:50807/sr-Latn-RS/Account/RegisterProfile
。任何人都不知道塞尔维亚文化从何而来?任何帮助将不胜感激!
最佳答案
我遇到了同样的问题,并通过将默认区域性设置为第一个区域性并指定约束来找到解决方案:
routes.MapRoute(
name: "DefaultCulture",
template: "{controller=Home}/{action=Index}/{id?}",
constraints: new { culture = "en"},
defaults: new { culture = "en" });
routes.MapRoute(
name: "NonDefaultCulture",
template: "{culture:culture=en}/{controller=Home}/{action=Index}/{id?}"
);
此处的关键是
constraints
参数。如果没有它,标签助手将检查第一个路由并看到它是否匹配,即使当前URL的路由具有不同的区域性。使用constraints
,算法将看到它无法将当前路线与约束条件匹配,并将继续执行下一条NonDefaultCulture
路线,这正是我们所需要的。