1

我需要在 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 metadata, ControllerContext context, IEnumerable attributes) 似乎是一项简单的任务

不过现在很复杂......

A. MVC DataannotationsModelValidator 的 ErrorMessage 属性是只读的。所以我不能在这里设置任何东西 B. System.ComponentModel.DataAnnotationErrorMessage 属性(获取和设置)已经在 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 ; 
             } 

            //...... 
       } 
  } 

谁能给我正确的方向?

提前致谢。

4

1 回答 1

0

我个人不会创建一个继承原始提供者的新提供者,但我会创建一个继承 ValidationAttribute 或 StringLengthAttribute 的新属性。

像这样的东西

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
)] 
于 2010-04-12T21:59:16.233 回答