繁体   English   中英

ASP.NET MVC 2.0验证和错误消息

[英]ASP.NET MVC 2.0 Validation and ErrorMessages

我需要在MVC 2.0中设置DataAnnotation的validate属性的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属性(获取并设置)已在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 ; 
             } 

            //...... 
       } 
  } 

谁能给我正确的方向吗?

提前致谢。

我个人不会创建一个继承原始提供程序的新提供程序,但会创建一个继承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
)] 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM