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

Posted

技术标签:

【中文标题】ASP.Net Core Tag Helper 链接忽略当前文化【英文标题】:ASP.Net Core Tag Helper links ignore current culture 【发布时间】:2018-04-18 23:34:42 【问题描述】:

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

这就是我在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?");
                );
            );
        );    

这是我在主导航菜单中的操作链接:

&lt;a asp-controller="Content" asp-action="About"&gt;@_localizer["nav_about"]&lt;/a&gt;

它曾经运行良好,我试图弄清楚为什么它不再运行但至今不知道。

有趣的是,所有标签都根据所选文化从资源文件中获取值,无论我切换到哪种文化,链接都会不断重定向到塞尔维亚语。从上面的标签助手生成的链接:http://localhost:50807/sr-Latn-RS/Content/About

提交表单也是如此:&lt;form asp-controller="Account" asp-action="RegisterProfile" method="post"&gt; 结果到http://localhost:50807/sr-Latn-RS/Account/RegisterProfile,无论当前选择哪种文化。

有人知道塞尔维亚文化从何而来吗?任何形式的帮助将不胜感激!

【问题讨论】:

【参考方案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 路由,这正是我们所需要的。

【讨论】:

以上是关于ASP.Net Core Tag Helper 链接忽略当前文化的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core MVC 中选择 ENUM Tag Helper

自动完成在 Visual Studio Code 中的 ASP.NET Core 5 Razor Tag Helper 中不起作用

asp.net Core MVC + form validation + ajax form 笔记

RenderSection() 是不是在 ASP.NET Core 的 <environment> 标签助手中工作?

集中位置的 ASP.NET Core Tag Helpers

在 MVC 5 中使用 MVC .Net Core Tag Helpers