Маршрутизация локализации на страницах идентификации в ASP.NET MVC Core - PullRequest
0 голосов
/ 18 января 2019

В настоящее время я занимаюсь разработкой веб-приложения в ASP.NET MVC Core, где пользователи должны зарегистрироваться. Это локализованное веб-приложение, которое должно работать на нескольких языках. Чтобы оптимизировать SEO, я выбрал маршрутизацию локализации, поэтому мой URL выглядит так: https://localhost:5001/en/Catalogue или https://localhost:5001/fr/catalogue.

Чтобы разрешить это, я добавил этот фрагмент кода в свой метод ConfigureServices в Startup.cs

services.AddLocalization(options => options.ResourcesPath = "Resources");

        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
            .AddViewLocalization()
            .AddDataAnnotationsLocalization();

В моем методе Configure я добавил это:

IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
    new CultureInfo("en"),
    new CultureInfo("fr"),
};
var localizationOptions = new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
};
var requestProvider = new RouteDataRequestCultureProvider();
localizationOptions.RequestCultureProviders.Insert(0, requestProvider);

app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture=en}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions);

        subApp.UseMvc(mvcRoutes =>
        {
            mvcRoutes.MapRoute(
                name: "areaRoute",
                template: "{culture=en}/{area:exists}/{controller=Home}/{action=Index}/{id?}");

            mvcRoutes.MapRoute(
                name: "default",
                template: "{culture=en}/{controller=Home}/{action=Index}/{id?}");
        });
    });
});

Это работает как шарм. Я могу перевести свои страницы MVC в любой вкус, который я хочу. Моя проблема с идентификационными страницами. Я добавил эти страницы как элементы лесов. Их URL указывают на https://localhost:5001/Identity/Account/Register. Попытка получить к ним доступ с помощью https://localhost:44339/en/Identity/Account/Register не работает. Как я могу реализовать локализованную локализацию с идентификационными страницами?

1 Ответ

0 голосов
/ 22 января 2019

AddAreaFolderRouteModelConvention сотворит волшебство:

services.AddMvc()
    .AddRazorPagesOptions(options =>
    {
        options.Conventions.AddAreaFolderRouteModelConvention("Identity", "/Account/", model =>
         {
             model.Selectors.ForEach(x =>
             {
                 if (x.AttributeRouteModel.Template.StartsWith("Identity"))
                 {
                     x.AttributeRouteModel = new AttributeRouteModel()
                     {
                         Order = -1,
                         Template = AttributeRouteModel.CombineTemplates(("{culture=en-US}"),
                             x.AttributeRouteModel.Template)
                     };
                 }
             });


         });
    });

На странице MSDN написано:

pageName String Имя страницы, например, / Users / List

Имя страницы - это путь к файлу без расширения относительно корневой каталог страниц для указанной области. например название страницы для файла Areas / Identity / Pages / Manage / Accounts.cshtml, есть /Manage/Accounts.

Так что все страницы на самом деле находятся внутри "/ Account /", вот несколько сгенерированных ссылок:

/en-us/identity/account/login
/en-us/identity/account/manage/index
/en-us/identity/account/manage/orders

если вам не нравится "/ identity /" внутри пути, вы можете сделать это:

AttributeRouteModel.CombineTemplates(("{culture=en-US}"), 
  x.AttributeRouteModel.Template.Substring("Identity/".Length)) //<==Substring

Тогда все ссылки будут:

/en-us/account/login
/en-us/account/manage/index
/en-us/account/manage/orders

enter image description here

...