Вы можете сделать это с помощью интерфейса 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);