1

MVC 2.0 で DataAnnotation の検証属性の ErrorMessage プロパティを設定する必要があります。たとえば、モデル プロパティの実際のエラー メッセージの代わりに ID を渡すことができるはずです。

[StringLength(2, ErrorMessage = "EmailContentID")] 
[DataType(DataType.EmailAddress)]         
public string Email { get; set; } 

次に、この ID ("EmailContentID") を使用して、データベースなどの別のサービスからコンテンツ (エラー メッセージ) を取得します。次に、ID の代わりにエラー エラー メッセージがユーザーに表示されます。これを行うには、DataAnnotation 検証属性の ErrorMessage プロパティを設定する必要があります。

DataAnnotationsModelValidatorProvider の保護されたオーバーライド IEnumerable GetValidators(ModelMetadata メタデータ、ControllerContext コンテキスト、IEnumerable 属性) をオーバーライドするだけで、簡単な作業のように思えます。

しかし、今は複雑です....

A. 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 ; 
             } 

            //...... 
       } 
  } 

誰でもこれについて正しい方向性を教えてもらえますか?

前もって感謝します。

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 に答える