2016-10-28 2 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

Убедитесь переопределить IsValid с ValidationContext станет доступом к вашему основному объекту. Затем перейдите к DueDate как для вашего Guid:

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

Что-то вроде этого должно это сделать. Вы справляетесь с этим так же, как и раньше. Если вы называете Validation вы даете в ValidationContext:

Например:

var results = new List<ValidationResult>(); 
Validator.TryValidateObject(this, new ValidationContext(YOUR_OBJECT_TO_VALIDATE, null, null), results, true); 
Смежные вопросы