我有一个使用 DisplayAttribute 进行本地化的枚举类型、资源文件和内置本地化支持的 aspnetcore。我可以通过例如使用
成功验证本地化在 View 中是否有效Html.GetEnumSelectList<TypeExample>().
如何在 Controller 甚至模型中获得相同的本地化 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()
}
最佳答案
我终于成功完成了这个任务。
我创建了一个枚举翻译服务,在启动时注册为临时服务
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。注入(inject)后,我将其用作:
_enumTranslatorService.TranslateDisplayName(EnumExampleType.A)
关于c# - 使用 Asp.Net Core 获取 Controller 中的本地化显示属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247853/