如何在 C# 中从数据库 > 资源文件中检索数据注释字符串?

How to retrieve data annotation strings from Database > Resource File in C#?

在 ASP.NET MVC5 中,我们使用的资源文件非常适合提供跨应用程序的翻译。这也适用于注释。

    [Required]
    [Display(Name = "ROLE", ResourceType = typeof(AdminRes))]
    public string UserRole { get; set; }

注释的字符串当前存储在资源文件中。

但我想要实现的是:我想检查数据库是否存在某个字符串(即 "ROLE")。如果是这样,我想将其用作 [Display(Name = "string")。如果没有找到这样的字符串,我想使用现有的资源文件作为替代并从那里获取字符串。

知道如何让它工作吗?

我是这样做的:

添加了我自己的 CustomModelMetadataProvider...

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    private DynamicStringService DynamicStringService;
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes,
          Type containerType, Func<object> modelAccessor,
          Type modelType, string propertyName)
    {
        var modelMetadata = base.CreateMetadata(attributes, containerType,
                modelAccessor, modelType, propertyName);


        List<DisplayAttribute> list = attributes.OfType<DisplayAttribute>().ToList();
        foreach (DisplayAttribute d in list)
        {
            if (!string.IsNullOrEmpty(d.Name))
            {
                try
                {
                    DynamicStringService = DependencyResolver.Current.GetService<DynamicStringService>();
                    Language userLanguage = GetCurrentUILanguage();

                    string changingValue = DynamicStringService.ChangeName(d.Name, userLanguage);
                    modelMetadata.DisplayName = changingValue;
                }
                catch (Exception e)
                {
                    continue;
                }
            }
        }
        return modelMetadata;
    }
}

..其中 DynamicStringService 检查数据库中注释 [Display] 中的字符串。

CustomModelMetadataProvider 在 Application_Start() 中的 Globasl.asax.cs 中使用如下:

ModelMetadataProviders.Current = new CustomModelMetadataProvider();