Я пытаюсь использовать 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 не выполняется, если маршрут включает в себя культуру?