У меня есть два модельных класса для парантных дочерних объектов.у каждого из них есть свойства даты.
правило проверки : дочерняя дата должна быть меньше или равна родительской дате в месяце и году.и я хочу использовать атрибут сравнения с родительским свойством и дочерним свойством.но мне не удалось передать параметр contextValidation метода isValid от родителя к ребенку.
пожалуйста, как мне это сделать успешно?
public class Parent
{
public int Id{get; set;}
public DateTime DateStartParent{get; set;}
[CompareDate("DateStartParent")]
public DateTime DateEndParent {get; set;}
public vertual ICollection<Child> Children{get; set;}
}
public class Child
{
public int Child{get; set;}
[CompareChildDate("DateStartParent")]
public DateTime DateChild {get; set;}
public virtual Partent Parent{get; set;}
}
namespace BusinessEntities.CustomValidation
{
public class CompareDate : ValidationAttribute
{
public string PropertyToCompar { get; set; }
public Type ModelType { get; set; }
public DateCompare(string comparedProperety):base(comparedProperety)
{
this.PropertyToCompar = comparedProperety;
}
public virtual bool ValidateDate(object value, DateTime comparedValue)
{
if (DateTime.Compare(comparedValue, (DateTime)value) < 0)
{
this.ErrorMessage = "La Date Début doit etre avant Date Fin";
return false;
}
else
{
return true;
}
public bool ValidateMoisEtAnnee(object value, DateTime comparedValue)
{
if (comparedValue.Year != ((DateTime)value).Year)
{
this.ErrorMessage = "une date de l'année précédente n'est pas authorisée";
return false;
}
else
{
return comparedValue.Month > ((DateTime)value).Month;
}
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
//define the entity to validdate
var dra = (Parent)validationContext.ObjectInstance;
//define the property to validate with
var property = validationContext.ObjectType.GetProperty(this.PropertyToCompar);
//get the property value
var comparedValue = (DateTime)property.GetValue(validationContext.ObjectInstance);
if (!ValidateDate(value, comparedValue))
return new ValidationResult(this.ErrorMessage);
else if (dra.DateDebutDra == (DateTime)value && !ValidateMoisEtAnnee(value, comparedValue))
return new ValidationResult(this.ErrorMessage);
else if (dra.DateFinDra == (DateTime)value && ValidateMoisEtAnnee(value, comparedValue))
return new ValidationResult(this.ErrorMessage);
else
return ValidationResult.Success;
}
}
public class DateChildCompare: DateCompare
{
private string _propertyToCompare;
public DateDepenseCompare (string propertyToCompare):base(propertyToCompare)
{
this._propertyToCompare = propertyToCompare ;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
//DateTime comparedValue = null;
//definir the entity to validate with
var depense = validationContext.ObjectInstance as Child;
//definir la proprité ou on applique la validation
var property =typeof(Parent).GetProperty(base.PropertyToCompar);
//get the value of this property
value = depense.DateDepense;
return base.IsValid(value, validationContext);
}
}
}