Netcore 2.2 Localized Routing - значения маршрута для культуры по умолчанию всегда игнорируются

Успешно используя проект, изложенный на Локализованная маршрутизация с использованием 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"

Предложения как?


person Tim Cadieux    schedule 03.09.2019    source источник


Ответы (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

person Ryan    schedule 04.09.2019