Netcore 2.2 本地化路由 - 始终忽略默认区域性的路由值

Posted

技术标签:

【中文标题】Netcore 2.2 本地化路由 - 始终忽略默认区域性的路由值【英文标题】:Netcore 2.2 Localized Routing - Route values for default culture always ignored 【发布时间】:2019-09-03 23:36:32 【问题描述】:

成功使用了Localized routing using ASP.NET Core MVC 2 中的项目。该项目被开发为仅使用控制器/操作和本地化路由来显示默认语言。

我的控制器

[LocalizationRoute("en", "Portal/Dashboard")]
[LocalizationRoute("fr", "Portail/tableau-de-bord")]
[LocalizationRoute("es", "Portal/Tablero")]
public class DashboardController : PortalBaseController

    private const string Title = "Dashboard";

    [LocalizationRoute("en", "Dashboardv1")]
    [LocalizationRoute("fr", "tableau-de-bordv1")]
    [LocalizationRoute("es", "Tablerov1")]
    public IActionResult Dashboardver1()

在我的登录控制器中,我希望创建一个本地化的 RedirectUrl...下面的代码为法语和西班牙语提供了一个完全本地化的路由,但默认路由始终只是控制器/操作。如果我手动输入英文、完全本地化的路线,页面会加载,但下面的代码总是只返回一个常规路径。

var culture = CultureInfo.CurrentCulture.Name;

var redirectUrl = LocalizationRouteDataHandler.GetUrl("Dashboard", "Dashboardver1", culture).Url;
//should be "en/portal/Dashboard/Dashboardv1"
//currently resolves to "Dashboard/Dashboardver1"

建议为 ?

【问题讨论】:

【参考方案1】:

我发现在 LocalizationRouteDataHandler.AddControllerRouteData 中,代码 ControllerRoutes[controllerKey].Names.TryAdd(culture, route); 首先将culture="en" 和 route="Dashboard" 添加到控制器名称字典中,然后当它尝试添加条件culture="en" 和 route ="en/Portal/Dashboard",由于添加了“en”键而失败。

一种解决方法是您可以删除不必要的密钥并添加新密钥。

LocalizationRouteDataHandler.cs

public static void AddControllerRouteData(string controller, string culture, string route)
    
        if (controller == "Dashboard")
        
            Console.WriteLine("test");
        
        string controllerKey = controller.ToLower();

        // If the controller doesn't exist, create it!            
        if (!ControllerRoutes.ContainsKey(controllerKey))
                        
            ControllerRoutes.TryAdd(controllerKey, new CultureControllerRouteData());
        
        // key removed
        if (culture=="en" && ControllerRoutes[controllerKey].Names.Remove("en"))
        
            ControllerRoutes[controllerKey].Names.TryAdd(culture, route);

        
        // dictionary doesn't contain the key
        else
        
            ControllerRoutes[controllerKey].Names.TryAdd(culture, route);

        

    

当我用

进行测试时
var redirectUrl = LocalizationRouteDataHandler.GetUrl("Dashboard", "Dashboardver1", "en").Url;

它返回/en/Portal/Dashboard/Dashboardver1

【讨论】:

以上是关于Netcore 2.2 本地化路由 - 始终忽略默认区域性的路由值的主要内容,如果未能解决你的问题,请参考以下文章

从 Body 迁移 .NET Core 2.2 到 3.1 集成测试始终为空

IsAuthenticated 在自定义授权属性(.NET Core 2.2 和 JSON Web 令牌)中始终为 false

apache2 忽略默认主机并始终重定向到域,即使使用 IP

ASP.NET Core 2.2 Razor 页面中的自定义路由

从 SVN 更新时是不是可以始终(强制)覆盖本地更改?忽略冲突?

路由器netcore的 本地web管理端口、啥意思啊?