Как использовать RouteDataRequestCultureProvider с включенной ASP.NET Core 2.2 EndpointRouting? - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь использовать RouteDataRequestCultureProvider в новом проекте ASP.NET Core 2.2 MVC.

Я прочитал документацию Microsoft по Маршрутизация в ASP.NET Core дляЯ понимаю изменения, внесенные в 2.2, но я не понимаю, почему "культура" не распознается как внешнее значение для генерации URL.

Я обновил ConfigureServices в Startup.cs, чтобы включить параметры:

var supportedCultres = new[] { new CultureInfo("en"), new CultureInfo("fr") };
services.Configure<RequestLocalizationOptions>(options =>
{
    options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en");
    options.SupportedCultures = supportedCultres;
    options.SupportedUICultures = supportedCultres;
    options.RequestCultureProviders = new[] { new RouteDataRequestCultureProvider { Options = options } };
});

И я изменил приложение и маршрут по умолчанию в Configure, чтобы использовать сегмент пути «культура»:

var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value;
app.UseRequestLocalization(locOptions);
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{culture:regex(^(en|fr)$)}/{controller=Home}/{action=Index}/{id?}");
});

Этот маршрут будет преобразован в HomeController.Index() при переходе клибо / en, либо / fr, как и ожидалось, но любые ссылки на другие действия с помощью Anchor Tag Helper будут отображаться как <a href=""> (включая ссылку Privacy, сгенерированную скаффолдом).

Отключение EnableEndpointRouting вызывает тег AnchorПомощник для работы снова:

services.AddMvc(opts => { opts.EnableEndpointRouting = false; })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

Добавление явного значения asp-route-culture также работает:

<a asp-route-culture="en" asp-controller="Home" asp-action="About">About</a>

Но я не понимаю, почему любое изменение требуется, так как маршрут "культура"значение уже присутствует в RouteData.Values collection и автоматически использовался помощником тега привязки с предыдущей моделью маршрутизации.Это действительные маршруты к действиям, так почему генерация URL не выполняется, если маршрут включает в себя культуру?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...