Tim Cadieux
Tim Cadieux

Reputation: 457

Netcore 2.2 Localized Routing - Route values for default culture always ignored

Successfully using the project laid out at Localized routing using ASP.NET Core MVC 2. The project is developed to display the Default language using just the controller/Action and Localized Routes for the alternate languages.

My Controller

[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()

In my SignIn controller I wish to create a localised RedirectUrl...the below code provides a fully localized route for the the french and spanish but the default route is always just controller/action. If I manually type in the english, fully localized route, the page loads but the code below always returns just a regular path.

var culture = CultureInfo.CurrentCulture.Name;

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

Suggestions as ?

Upvotes: 0

Views: 189

Answers (1)

Ryan
Ryan

Reputation: 20116

I find that In LocalizationRouteDataHandler.AddControllerRouteData ,code ControllerRoutes[controllerKey].Names.TryAdd(culture, route); adds culture="en" and route="Dashboard" first to the Dictionary of Controller Name and then when it tries to add the condition culture="en" and route="en/Portal/Dashboard",it fails since the "en" key has added.

A workaround is that you could remove the unnecessary key and add the new key.

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);

        }

    }

When I test with

var redirectUrl = LocalizationRouteDataHandler.GetUrl("Dashboard", "Dashboardver1", "en").Url;

It returns /en/Portal/Dashboard/Dashboardver1

Upvotes: 1

Related Questions