我做了另一种方法。它仍然需要您继承DataAnnotation
属性,但您可以获得更灵活的翻译解决方案。
我的博客文章中的代码(阅读更多详细信息)
最终结果
public class User
{
[Required]
[LocalizedDisplayNameAttribute("User_Id")]
public int Id { get; set; }
[Required]
[StringLength(40)]
[LocalizedDisplayNameAttribute("User_FirstName")]
public string FirstName { get; set; }
[Required]
[StringLength(40)]
[LocalizedDisplayNameAttribute("User_LastName")]
public string LastName { get; set; }
}
1 像这样继承所有数据注释属性
public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
private string _displayName;
public RequiredAttribute()
{
ErrorMessageResourceName = "Validation_Required";
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
_displayName = validationContext.DisplayName;
return base.IsValid(value, validationContext);
}
public override string FormatErrorMessage(string name)
{
var msg = LanguageService.Instance.Translate(ErrorMessageResourceName);
return string.Format(msg, _displayName);
}
}
2 继承显示名称属性
public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
private PropertyInfo _nameProperty;
private Type _resourceType;
public LocalizedDisplayNameAttribute(string className, string propertyName)
: base(className + (propertyName == null ? "_Class" : ("_" + propertyName)))
{
}
public override string DisplayName
{
get
{
return LanguageService.Instance.Translate(base.DisplayName) ?? "**" + base.DisplayName + "**";
}
}
}
3.创建语言服务(你可以在里面切换到任何语言源)
public class LanguageService
{
private static LanguageService _instance = new LanguageService();
private List<ResourceManager> _resourceManagers = new List<ResourceManager>();
private LanguageService()
{
}
public static LanguageService Instance { get { return _instance; } }
public void Add(ResourceManager mgr)
{
_resourceManagers.Add(mgr);
}
public string Translate(string key)
{
foreach (var item in _resourceManagers)
{
var value = item.GetString(key);
if (value != null)
return value;
}
return null;
}
}
最后,您需要注册用于翻译验证消息和模型的字符串表
LanguageService.Instance.Add(MyNameSpace.ModelResource.ResourceManager);
LanguageService.Instance.Add(MyNameSpace.ValidationResources.ResourceManager);