ASP.NET MVC 2.0验证和ErrorMessages

时间:2010-04-12 20:51:11

标签: asp.net-mvc validation asp.net-mvc-2 asp.net-mvc-2-validation

我需要在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 ; 
             } 

            //...... 
       } 
  } 

有人可以给我正确的方向吗?

提前致谢。

1 个答案:

答案 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
)]