比较实体之间的日期时间
本文关键字:日期 时间 之间 实体 比较 | 更新日期: 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);
}