Specifiesthatthefieldmustcomparefavourablywiththenamedfield,ifobjectstocheckarenotofthes
///
/// Specifies that the field must compare favourably with the
named field, if objects to check are not of the same type
/// false will be return
///
public class CompareValuesAttribute :
ValidationAttribute
{
///
/// The other property to compare to
///
public string OtherProperty { get; set; }
public CompareValues Criteria { get; set;
}
///
/// Creates the attribute
///
///
The other
property to compare to
public CompareValuesAttribute(string
otherProperty, CompareValues criteria)
{
if (otherProperty == null)
throw new
ArgumentNullException("otherProperty");
OtherProperty =
otherProperty;
Criteria = criteria;
}
///
/// Determines whether the specified value of
the object is valid. For this to be the case, the objects must be of the
same type
/// and satisfy the comparison criteria. Null
values will return false in all cases except when both
/// objects are null. The objects will
need to implement IComparable for the GreaterThan,LessThan,GreatThanOrEqualTo
and LessThanOrEqualTo instances
///
///
The value of the
object to validate
///
The
validation context
/// A validation result if the
object is invalid, null if the object is valid
protected override ValidationResult
IsValid(object value, ValidationContext validationContext)
{
// the the other property
var property =
validationContext.ObjectType.GetProperty(OtherProperty);
// check it is not null
if (property == null)
return new
ValidationResult(String.Format("Unknown property: {0}.", OtherProperty));
// check types
var memberName =
validationContext.ObjectType.GetProperties().Where(p =>
p.GetCustomAttributes(false).OfType().Any(a => a.Name
== validationContext.DisplayName)).Select(p =>
p.Name).FirstOrDefault();
if (memberName == null)
{
memberName =
validationContext.DisplayName;
}
if
(validationContext.ObjectType.GetProperty(memberName).PropertyType !=
property.PropertyType)
return new
ValidationResult(String.Format("The types of {0} and {1} must be the same.",
memberName, OtherProperty));
// get the other value
var other =
property.GetValue(validationContext.ObjectInstance, null);
// equals to comparison,
if (Criteria ==
CompareValues.EqualTo)
{
if
(Object.Equals(value, other))
return null;
}
else if (Criteria ==
CompareValues.NotEqualTo)
{
if
(!Object.Equals(value, other))
return null;
}
else
{
// check that both
objects are IComparables
if (!(value is
IComparable) || !(other is IComparable))
return new ValidationResult(String.Format("{0} and {1} must both implement
IComparable", validationContext.DisplayName, OtherProperty));
// compare the
objects
var result =
Comparer.Default.Compare(value, other);
switch
(Criteria)
{
case
CompareValues.GreaterThan:
if (result > 0)
return null;
break;
case
CompareValues.LessThan:
if (result <0)
return null;
break;
case
CompareValues.GreatThanOrEqualTo:
if (result >= 0)
return null;
break;
case
CompareValues.LessThanOrEqualTo:
if (result <= 0)
return null;
break;
}
}
// got this far must mean the
items don‘t meet the comparison criteria
return new
ValidationResult(ErrorMessage);
}
}
///
/// Indicates a comparison criteria used by the CompareValues
attribute
///
public enum CompareValues
{
EqualTo,
NotEqualTo,
GreaterThan,
LessThan,
GreatThanOrEqualTo,
LessThanOrEqualTo
}
应用的时候直接在指定的属性上添加此CompareValuesAttribute标签即可
【注:第一个参数是要与之比较的属性名,第二个参数表示两个属性值之间的大小关系,第三个参数表示错误提示信息】
public class EricSunModel
{
[Display(Name = "Ready Time")]
public string ReadyTime { get; set; }
[CompareValues("ReadyTime", CompareValues.GreaterThan,
ErrorMessage = "Close time must be later than ready time")]
[Display(Name = "Close Time")]
public string CloseTime { get; set; }
MVC日期比较(转),布布扣,bubuko.com