In the last post, I went through the steps to make a custom validation attribute - if you missed it, check it out here:
Creating Custom Validation Attribute. Now let's say we want to make our validator to look up on the value "37" from another property in our class (instead of hard-coding it). How do we do that? With the help of reflection, we can do that quite easily.
Here is our modified class:
In our new custom validator, we override a different IsValid method (the original one is commented out):
That's it!
Additional reading:
public class MyClass {
// ... more code
[MagicNumber("ThirtySeven", ErrorMessage = "Sum is not correct")]
public int MyData { get; set; }
// ... more code
public int ThirtySeven {
get { return 37; }
}
// ... more code
}
In our new custom validator, we override a different IsValid method (the original one is commented out):
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
sealed public class MagicNumberAttribute : ValidationAttribute {
// constructor to accept the comparison property name
public MagicNumberAttribute(string thirtySevenProperty) : base() {
if (thirtySevenProperty == null) {
throw new ArgumentNullException("thirtySevenProperty");
}
ThirtySevenProperty= thirtySevenProperty;
}
// property to store the comparison field name
public string ThirtySevenProperty{ get; private set; }
// public override bool IsValid(object value) {
// var num = int.Parse(value.ToString());
// return num == 37;
// }
protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
// get property info of the "ThirtySevenProperty"
PropertyInfo thirtySevenPropertyInfo = validationContext.ObjectType.GetProperty(ThirtySevenProperty);
// check if that property exists / valid
if (thirtySevenPropertyInfo == null) {
return new ValidationResult(String.Format(CultureInfo.CurrentCulture, "UNKNOWN PROPERTY", ThirtySevenProperty));
}
// get the value of the property
object thirtySevenPropertyValue = thirtySevenPropertyInfo.GetValue(validationContext.ObjectInstance, null);
// do comparison and return validation result with error if not equal
if (!Equals(value, thirtySevenPropertyValue)) {
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
// return null if everything is ok
return null;
}
}
That's it!
Additional reading:
1 comment:
Nice post!
Post a Comment