在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作为替代,并从那里获取字符串。
任何明白的想法如何让这个工作?
答案 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();