Я реализовал локализованные маршруты, используя ApplicationModelConvention
.
Это работает нормально, пока я набираю URL прямо в браузере.
Так, например, немецкие маршруты ожидаются только в немецкой культуре. и маршруты из других языков возвращают 404. Именно так, как и ожидалось.
Но когда я использую Url.Action
, не соблюдаются ограничения. так, например, если я на английском домене, я получаю русские ссылки
Что я делаю не так?
мой код здесь:
services.AddMvc(o =>
{
o.Conventions.Insert(0, new LocalizedRouteConvention());
})
public class LocalizedRouteConvention : IApplicationModelConvention
{
public void Apply(ApplicationModel application)
{
foreach (var controller in application.Controllers)
{
foreach (var action in controller.Actions)
{
var attributes = action.Attributes.OfType<RouteAttribute>().ToArray();
if (!attributes.Any()) return;
foreach (var attribute in attributes)
{
SelectorModel defaultSelector = action.Selectors.First();
foreach (var localizedVersion in GetLocalized(attribute.Template))
{
if (!action.Selectors.Any(s => s.AttributeRouteModel.Template == localizedVersion.Template))
{
action.Selectors.Insert(0, new SelectorModel(defaultSelector)
{
AttributeRouteModel = localizedVersion,
ActionConstraints =
{
new CultureActionConstraint { Culture = ((LocalizedRouteAttribute) localizedVersion.Attribute).Culture }
}
});
}
}
}
}
}
}
}