2016-10-28 70 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屬性的值之前,甚至更多,DueDate的值應該是基於DeliveryMethod

我不知所措;我如何創建這樣的驗證?我知道,我可以簡單地使用一個方法,返回true或false與幾個if語句,但我想使用數據註釋如果可能的話,以便我可以使用相同的錯誤處理程序。

我使用的數據庫,首先與實體框架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); 
相關問題