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

时间:2015-08-24 14:58:23

标签: c# asp.net asp.net-mvc data-annotations

在ASP.NET MVC5中,我们使用的资源文件非常适合在应用程序之间提供翻译。这对Annotations也适用。

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

Annotations的字符串当前存储在Resource-Files中。

但我想要实现的目标如下:我想检查数据库是否存在某个字符串(即“ROLE”)。如果是,我想将其用作[Display(Name = "string")。如果找不到这样的字符串,我想使用现有的Resource-File作为替代,并从那里获取字符串。

任何明白的想法如何让这个工作?

1 个答案:

答案 0 :(得分:0)

我是这样做的:

添加了我自己的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在Annotation [Display]中检查数据库中的String。

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

ModelMetadataProviders.Current = new CustomModelMetadataProvider();