Локализованные имена страниц с ASP.NET Core 2.1 - PullRequest
0 голосов
/ 13 сентября 2018

При создании страницы Razor, например «Events.cshtml», один получает название своей модели, установленное на

@page
@model EventsModel

где имя страницы в этом случае - "События", а URL будет выглядеть как

http://example.com/Events

Чтобы использовать названия страниц на норвежском, я добавил следующее в «Startup.cs»

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
    .AddRazorPagesOptions(options => {
        options.Conventions.AddPageRoute("/Events", "/hvaskjer");
        options.Conventions.AddPageRoute("/Companies", "/bedrifter");
        options.Conventions.AddPageRoute("/Contact", "/kontakt");
});

При этом я также могу использовать URL-адрес, подобный этому, и по-прежнему отображать страницу «События»

http://example.com/hvaskjer

Я планирую поддерживать еще много языков и задаюсь вопросом, это рекомендуемый способ настройки локализованных имен страниц / маршрутов? Или есть более правильный, правильный способ сделать то же самое.

Я имею в виду, что с приведенным выше примером и 15 страницами на 10 языках он становится / кажется грязным, используя options.Conventions.AddPageRoute("/Page", "/side"); 150 раз.

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете сделать это с помощью интерфейса IPageRouteModelConvention. Он предоставляет доступ к PageRouteModel, где вы можете эффективно добавлять больше шаблонов для сопоставления маршрутов для конкретной страницы.

Вот очень простое доказательство концепции, основанное на следующем сервисе и модели:

public interface ILocalizationService
{
    List<LocalRoute> LocalRoutes();
}
public class LocalizationService : ILocalizationService
{
    public List<LocalRoute> LocalRoutes()
    {
        var routes = new List<LocalRoute>
        {
            new LocalRoute{Page = "/Pages/Contact.cshtml", Versions = new List<string>{"kontakt", "contacto", "contatto" } }
        };
        return routes;
    }
}

public class LocalRoute
{
    public string Page { get; set; }
    public List<string> Versions { get; set; }
}

Все, что он делает, это предоставляет список опций для конкретной страницы. Реализация IPageRouteModelConvention выглядит следующим образом:

public class LocalizedPageRouteModelConvention : IPageRouteModelConvention
{
    private ILocalizationService _localizationService;

    public LocalizedPageRouteModelConvention(ILocalizationService localizationService)
    {
        _localizationService = localizationService;
    }

    public void Apply(PageRouteModel model)
    {
        var route = _localizationService.LocalRoutes().FirstOrDefault(p => p.Page == model.RelativePath);
        if (route != null)
        {
            foreach (var option in route.Versions)
            {
                model.Selectors.Add(new SelectorModel()
                {
                    AttributeRouteModel = new AttributeRouteModel
                    {
                        Template = option
                    }
                });
            }
        }
    }
}

При запуске Razor Pages строят маршруты для приложения. Метод Apply выполняется для каждой навигационной страницы, которую находит каркас. Если относительный путь текущей страницы совпадает с указанным в ваших данных, для каждой опции добавляется дополнительный шаблон.

Вы регистрируете новое соглашение в ConfigureServices:

services.AddMvc().AddRazorPagesOptions(options =>
{
    options.Conventions.Add(new LocalizedPageRouteModelConvention(new LocalizationService()));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...