2017-07-18 1 views
0

Nous créons l'attribut personnalisé "SpecificDateAttribute" pour les propriétés de calss. Comment pouvons-nous forcer tous les DTO qui ont une propriété avec cet attribut, valider la méthode ICustomValidate?Ajouter un mécanisme de validation personnalisé à abpBoilerplate dtos?

+0

caisse suivant urls https://aspnetboilerplate.com/Pages/Documents/Validating-Data-Transfer-Objects#DocCustomValidation https://forum.aspnetboilerplate.com/viewtopic.php?f=2&t=2819 –

+0

@AlperEbicoglu. Oui, nous pouvons implémenter l'interface ICustomValidate, mais dois-je l'implémenter séparément pour chaque Dtos? Puis-je l'implémenter une fois pour tous les Dtos? –

+0

Vous me manquez pourquoi vous avez besoin. S'il vous plaît, postez du code –

Répondre

0

Je crée la classe de base pour DTO comme ceci:

public class AzmaBaseDto: ICustomValidate 
{ 
    public virtual void AddAzmValidationErrors(CustomValidationContext context) 
    { 

    } 

    public void AddValidationErrors(CustomValidationContext context) 
    { 
     var properties = this.GetType() 
      .GetProperties(); 

     foreach (var a in properties.Where(p => p.IsDefined(typeof(ShamsiDateAttribute), false))) 
     { 
      #region 
      var v = a.GetValue(this); 
      if (v == null || DateTimeConvert.IsValidShamsiDate(v.ToString()) == false) 
      { 
       string _name = a.Name; 
       if (a.IsDefined(typeof(DisplayAttribute), false)) 
       { 
        var ca = (DisplayAttribute)a.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault(); 
        if (ca.Name.IsNullOrEmpty() == false) 
         _name = ca.Name; 
       } 
       context.Results.Add(new ValidationResult("Property value [" + _name + "] is not valid")); 
      } 
      #endregion 
     } 

        AddAzmValidationErrors(context); 
    } 
} 

et DTO forme elle héritent. comme ceci

public class UpsertAccountingDocumentInput : AzmaBaseDto 
{ 

    [ShamsiDate] 
    public string Date { get; set; } 



    public bool? SaveAsMemo { get; set; } 



    public override void AddAzmValidationErrors(CustomValidationContext context) 
    { 
     if(SaveAsMemo==false && Date.IsNullOrEmpty()==false) 
     { 
      context.Results.Add(new ValidationResult("Put some error info")); 
     } 

     base.AddAzmValidationErrors(context); 
    } 
} 

Je pense que cela peut être l'une des bonnes réponses.

+0

Je pense que cela fonctionne. Mon doute était sur la façon dont vous avez fait votre question: à partir de vous répondre à ma sous-estimation maintenant, vous voulez être sûr que tous les DTO dérivées exécutent vos AddValidationErrors de base et appellent vos AddAzmValidationErrors spécifiques. Si oui, cela fonctionne –