2016-10-28 8 views
0

私は特定の値の検証に苦労しています。複数のプロパティ依存関係を持つカスタム検証を作成する方法

は、(それが問題を解決のために不要な列を除外し、簡略化されています)以下のクラスを考えてみましょう:

using System; 
using System.Collections.Generic; 

public partial class Data_Header 
{ 
    public Data_Header() 
    { 
     this.Data_Lines = new HashSet<Data_Lines>(); 
    } 

    public int DataHeaderID { get; set; } 
    public System.Guid CmpWwn { get; set; } 
    public System.Guid CntId { get; set; } 
    public System.DateTime DeliveryDate { get; set; } 
    public Nullable<int> DeliveryMethod_SysDeliveryMethodsID { get; set; } 
    public System.DateTime DueDate { get; set; } 

    public virtual Sys_DeliveryMethods Sys_DeliveryMethods { get; set; } 
    public virtual vw_cicmpy vw_cicmpy { get; set; } 
    public virtual ICollection<Data_Lines> Data_Lines { get; set; } 
} 

私はCmpWwnとCntIdの検証を作成するために行っていることはRequiredGuidAttributeという名前のカスタム属性を作成しています私はStackOverflowのどこかで見つけました:

public class RequiredGuidAttribute : RequiredAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var guid = CastToGuidOrDefault(value); 

     return !Equals(guid, default(Guid)); 
    } 

    private static Guid CastToGuidOrDefault(object value) 
    { 
     try 
     { 
      return (Guid)value; 
     } 
     catch (Exception e) 
     { 
      if (e is InvalidCastException || e is NullReferenceException) return default(Guid); 
      throw; 
     } 
    } 
} 

したがって、この注釈を使用してGuid値を検証できます。これはあまり難しくないと私は原則を理解しています。今度は次の問題:

私は、DueDateの値が現在の日付の前に決してなく、決してDeliveryDateプロパティの値より前ではないことを確認したいと思います.DayDateの値は、 DeliveryMethod

私は迷っています。このような検証を作成するにはどうすればよいですか?私は単純にいくつかのif文でtrueまたはfalseを返すメソッドを使用することができますが、同じエラーハンドラを使用できるようにデータアノテーションを可能な限り使用したいと思います。私は、データベース・第1エンティティフレームワークで使用しています

6.

答えて

1

は、あなたの基礎となるオブジェクトへのアクセスのためになるValidationContextでのIsValidを上書きすることを確認します。次に、あなたのGUIDのためとしてDueDateのために行く:このような

public override bool IsValid(object value, ValidationContext validationContext) 
{ 
    var dataHeader = validationContext.ObjectInstance as Data_Header; 
    var dueDate = dataHeader.CalculateDueDate; 
    bool isValid = false; 

    if (dueDate.CompareTo(DateTime.Now) < 0 || 
     dueDate.CompareTo(dataHeader.DeliveryDate) < 0) 
    { 
     isValid = false; 
    } 

    return isValid; 
} 

何かがそれを行う必要があります。以前はGuidと同じように扱っています。あなたの検証を呼び出す場合は、ValidationContextに与える:例えば

var results = new List<ValidationResult>(); 
Validator.TryValidateObject(this, new ValidationContext(YOUR_OBJECT_TO_VALIDATE, null, null), results, true); 
関連する問題