Получить локализованный атрибут отображения в контроллере с помощью Asp.Net Core - PullRequest
2 голосов
/ 22 мая 2019

У меня есть тип enum, локализованный с использованием DisplayAttribute, файла ресурсов и встроенной поддержки aspnetcore. Я могу успешно проверить, что локализация работает в представлении, например, используя

Html.GetEnumSelectList<TypeExample>(). 

Как я могу получить тот же локализованный DisplayAttribute в контроллере или даже в модели.

Я пытался использовать код вроде:

var name = TypeExample.A.GetType()?
            .GetMember(TypeExample.A.ToString())?
            .FirstOrDefault()?
            .GetCustomAttribute<DisplayAttribute>()?.GetName();

но оно не возвращает локализованное отображаемое имя.

Я хотел бы использовать его в модели для ApiController, например.

public class Model
{
    public TypeExample Type { get; set; }

    public string TypeDisplayValue => Type.GetDisplayValue()
}

1 Ответ

0 голосов
/ 24 мая 2019

Наконец-то я справился с этой задачей.

Я создал службу переводчиков enum, которая зарегистрирована при запуске как временная служба

public class EnumTranslatorService:IEnumTranslatorService
{
    private IModelMetadataProvider _metadataProvider;

    public EnumTranslatorService(IModelMetadataProvider metadataProvider)
    {
        _metadataProvider = metadataProvider;
    }

    public string TranslateDisplayName<TEnum>(TEnum e) where TEnum : struct
    {
        var a = _metadataProvider.GetMetadataForType(e.GetType());
        var name = a.EnumGroupedDisplayNamesAndValues.FirstOrDefault(t => 
                       t.Value ==  a.EnumNamesAndValues[e.ToString()]).Key.Name;

        return name ?? e.ToString();
    }
}

Он использует IModelMetadataProvider, созданный в aspnetcore. После введения я использую его как:

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