ASP.Net Core Tag Helper链接忽略了当前的文化

时间:2018-04-18 23:34:42

标签: c# asp.net-core culture asp.net-core-tag-helpers

我正在建立一个支持阿尔巴尼亚语,英语和塞尔维亚语的多语言网站,但不知何故,标签帮助者生成的所有链接都会重定向到塞尔维亚语。

这就是我在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生成localStorage.stuff = JSON.stringify(['a', 'b', 2]); console.log(JSON.parse(localStorage.stuff));

任何人都知道从哪里获取塞尔维亚文化?任何形式的帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

我也遇到了同样的问题,并通过将默认区域性设置为第一个区域并指定约束来找到解决方案:

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路线。