比较实体之间的日期时间

本文关键字:日期 时间 之间 实体 比较 | 更新日期: 2023-09-27 18:00:40

当我想在实体之间进行比较时,我很难理解如何扩展ValidationAttribute类。

例如,我有以下2个实体:

public class Incident
{
    public DateTime IncidentDate {get;set;}
    //other properties
    public virtual ICollection<Grievance> Grievances {get;set;}
}
public class Grievance
{
    public DateTime FileDate {get;set;}
    public DateTime? HearingDate {get;set;}
    //other properties
    public virtual Incident Incident {get;set;}  
}

我想验证(服务器端,因为这个DLL将被多个不同的项目使用)申诉属性的两个DateTime是否在相应事件的IncidentDate属性之后。

理想情况下,我想编写一个HearingDateAttribute : ValidationAttribute类型的类,但我不确定如何获得IncidentDate属性来比较IsValid重写。

编辑

好的,这似乎有效,但我不确定这是否是最佳实践:

public sealed class HearingDateAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        var hearingDate = (DateTime)value;
        var grievance = (Grievance)context.ObjectInstance;
        var incidentDate = grievance.Incident.IncidentDate;
        if (hearingDate > incidentDate.Value)
        {
            return ValidationResult.Success;
        }
        return null;
    }
}

比较实体之间的日期时间

数据注释适合触发对单个属性的简单验证,但不适合模型级验证。您应该在您的实体上实现IValidatableObject。类似这样的东西:

public class Grievance: IValidatebleObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
     { 
         if (FileDate < Incident.IncidentDate 
            ||(HearingDate.HasValue && HearingDate.Value < Incident.IncidentDate)) 
         { 
             yield return new ValidationResult 
              ("Dates invalid", 
               new[] { "FileDate", “HearingDate”, "Incident.IncidentDate" }); 
         } 
     }  
}

参考:

http://msdn.microsoft.com/en-us/data/gg193959.aspx

您可以为Grievance类编写类似的内容

public bool AreDatesBiggerThanIncident()
{
    return FileDate>Incident.IncidentDate && (HearingDate.HasValue? HearingDate.Value>Incident.IncidentDate : true);
}

我以为你不希望你的可空日期时间破坏检查,但你可以扩展它,例如:

public bool AreDatesBiggerThanIncident(bool returnFalseIfNullableEmpty=false)
{
    return FileDate>Incident.IncidentDate && (HearingDate.HasValue? HearingDate.Value>Incident.IncidentDate : !returnFalseIfNullableEmpty);
}