[英]use IModelValidator to Create a Custom Property Validation Attribute
[英]How to create custom validation with multiple property dependencies
我正在努力验证某些值,希望有人能指出正确的方向。
考虑下面的类(它已被简化,省去了不需要的列来解决问题):
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的计算值
我不知所措; 如何创建这样的验证? 我知道我可以简单地使用一种返回带有几个if语句的true或false的方法,但是如果可能的话,我想使用数据注释,以便可以使用相同的错误处理程序。
我在实体框架6中使用数据库优先。
确保使用ValidationContext覆盖IsValid,以访问您的基础对象。 然后按照您的Guid进行DueDate:
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;
}
这样的事情应该做。 您可以像以前在Guid上一样处理此问题。 如果调用Validation,则在ValidationContext中输入:
例如:
var results = new List<ValidationResult>();
Validator.TryValidateObject(this, new ValidationContext(YOUR_OBJECT_TO_VALIDATE, null, null), results, true);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.