美好的一天!
我使用了以下用于登录表单的ViewModel类:
using System.ComponentModel.DataAnnotations;
...
public class UserLogin : IDataErrorInfo
{
[Required]
[DisplayName("Login")]
public string Login { get; set; }
[Required]
[DisplayName("Password")]
public string Password { get; set; }
[DisplayName("Remember Me")]
public bool RememberMe { get; set; }
#region IDataErrorInfo Members
// This will be a Model-level error
public string Error
{
get
{
if (!WebUser.CanLogin(Login, Password))
{
return Resources.ValidationErrors.InvalidLoginPassword;
}
else
{
return String.Empty;
}
}
}
// All is handled by DataAnnotation attributes, just a stub for interface
public string this[string columnName]
{
get
{
return string.Empty;
}
}
#endregion
}
这是Global.asax
:
DefaultModelBinder.ResourceClassKey = "BinderMessages";
ValidationExtensions.ResourceClassKey = "BinderMessages";
资源文件BinderMessages.resx
放在App_GlobalResources中,它有两个键InvalidPropertyValue
(可以正常工作)和PropertyValueRequired
但没有给我默认消息。
问题:是否可以修改此消息,或者它与DataAnnotations绑定?
我发现了很多关于此的帖子,但没有解决方案。现在我回到这个:
[Required(ErrorMessageResourceType = typeof(Resources.ValidationErrors), ErrorMessageResourceName = "Required")]
答案 0 :(得分:6)
您可以创建扩展ValidationAttribute
的自定义RequiredAttribute
并在其中设置值。类似的东西:
public class MyRequiredAttribute : RequiredAttribute
{
public MyRequiredAttribute()
{
ErrorMessageResourceType = typeof(Resources.ValidationErrors);
ErrorMessageResourceName = "Required";
}
}
然后使用您的自定义属性装饰您的模型。
默认消息被编译到System.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources.resources
下的资源文件中的DataAnnotations程序集中,并且是RequiredAttribute_ValidationError=The {0} field is required.
。所以,回答你的问题,是的,该消息是DataAnnotations的一部分。
编辑:PropertyValueRequired
用于具有非可空类型的空值的错误。如下所述,PropertyValueInvalid
用于类型转换错误。
答案 1 :(得分:1)
我已经使用单例类来提供翻译。您仍然需要按@bmancini的建议派生所有属性。我的方法的优点是你可以使用多个字符串表(或切换翻译源),而无需修改任何其他逻辑。
由于我的博客条目相当大,我只提供一个链接: http://blog.gauffin.org/2010/11/simplified-localization-for-dataannotations/