我需要在MVC 2.0中设置DataAnnotation的验证属性的ErrorMessage属性。例如,我应该能够传递ID而不是Model属性的实际错误消息,例如......
[StringLength(2, ErrorMessage = "EmailContentID")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
然后使用此ID(“EmailContentID”)从另一个服务(例如数据库)检索某些内容(错误消息)。然后向用户显示错误错误消息而不是ID。为此,我需要设置DataAnnotation验证属性的ErrorMessage属性。
通过覆盖DataAnnotationsModelValidatorProvider的受保护覆盖IEnumerable GetValidators(ModelMetadata元数据,ControllerContext上下文,IEnumerable属性),这似乎是一个直接的前进任务
然而现在它很复杂......
一个。 MVC DatannotationsModelValidator的ErrorMessage属性是只读的。所以我不能在这里设置任何东西 B. System.ComponentModel.DataAnnotationErrorMessage属性(get和set)已在MVC DatannotationsModelValidator中设置,因此我无法再次设置它。如果我尝试设置它,我会得到“该属性不能设置多次......”错误消息。
public class CustomDataAnnotationProvider : DataAnnotationsModelValidatorProvider
{
protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
IEnumerable<ModelValidator> validators = base.GetValidators(metadata, context, attributes);
foreach (ValidationAttribute validator in validators.OfType<ValidationAttribute>())
{
messageId = validator.ErrorMessage;
validator.ErrorMessage = "Error string from DB And" + messageId ;
}
//......
}
}
有人可以给我正确的方向吗?
提前致谢。
答案 0 :(得分:0)
我个人不会创建一个继承原始提供程序的新提供程序,但我会创建一个继承ValidationAttribute或StringLengthAttribute的新Attribute。
像这样的东西
public class MyNewValidationAttribute : StringLengthAttribute
{
public int ErrorMessageId
{
set {
var myErrorMessageFromDB = ""; //query database and get message.
this.ErrorMessage = myErrorMessageFromDB;
}
}
}
现在分配属性
[StringLength(2, ErrorMessageId = 1 //equals id from database
)]