Я пытаюсь использовать 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, как и ожидалось, но любые ссылки на другие действия с помощью вспомогательного тега привязки будут отображаться как <a href = "">
(включая ссылку конфиденциальности, созданную скаффолдом).
Отключение EnableEndpointRouting заставляет помощник тега привязки снова работать:
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
и автоматически использовалось помощником тега привязки с предыдущей моделью маршрутизации. Это допустимые маршруты к действиям, так почему же генерация URL-адреса завершается ошибкой, если маршрут включает культуру?
у меня такая же проблема в ядре 3.1 - stackoverflow.com/questions/59267971/…
У меня была такая же проблема с net core 3.1. В конце концов мне удалось выяснить причину и найти решение.
прочитайте мое решение здесь -
TLDNR: поскольку значения окружающего маршрута ядра 2.2 больше не передаются в конструктор URL-адресов, вам необходимо явно передать их. Я решил эту проблему, расширив помощник тега привязки бритвы.
Вам удалось это решить?