使用Asp.Net Core

时间:2019-05-22 00:29:07

标签: c# asp.net-core

我有一个使用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 :(得分:0)

最后我成功完成了这个任务。

我创建了一个枚举转换器服务,该服务在启动时注册为临时服务

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();
    }
}

它使用在aspnetcore中创建的IModelMetadataProvider。注入后,我将其用作:

_enumTranslatorService.TranslateDisplayName(EnumExampleType.A)