首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将属性与父子模型进行比较

如何将属性与父子模型进行比较
EN

Stack Overflow用户
提问于 2018-09-28 03:16:25
回答 1查看 185关注 0票数 1

我有两个父子实体的模型类。它们中的每一个都有日期属性。

验证规则为:子日期必须小于等于父日期的月份和年。并且我想使用带有父属性和子属性的比较属性。但是我没有成功地将isValid方法的contextValidation参数从父级传递到子级。

请问,我怎样才能成功地做到这一点?

代码语言:javascript
复制
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);                                    

      }

    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-09-28 03:34:42

如果用例相当有限,您可能不需要向子级添加单独的验证属性。下面这样的方法应该是可行的:

代码语言:javascript
复制
public class Parent
{
  [CompareChildDates]
  public DateTime Time { get; set; }
  public List<Child> Children { get; set; } 
}

public class Child
{
  public DateTime Time { get; set; }
}

public class CompareChildDatesAttribute : ValidationAttribute
{
  protected override ValidationResult IsValid(object value, ValidationContext context)
  {
    if (context.ObjectInstance is Parent parent 
      && value is DateTime parentTime
      && parent.Children.All(child => parentTime >= child.Time))
    {
      return ValidationResult.Success;
    }
    return new ValidationResult("Validation Error Message");
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52543732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档