/// <summary> /// Merges the specified messages. /// </summary> /// <param name="validationSource">The validation source.</param> /// <param name="propertyName">Name of the property.</param> /// <returns> /// The merged message. /// </returns> public MergedValidationMessage Merge(IValidatable validationSource, string propertyName = null) { validationSource.CannotBeNull(); ValidationMessageCollection messages = new ValidationMessageCollection(); if (propertyName == null) { foreach (var validationMessage in this) { if (validationMessage.ValidationSource == validationSource) { messages.Add(validationMessage); } } } else { foreach (var validationMessage in this) { if (validationMessage.ValidationSource == validationSource && validationMessage.PropertyName == propertyName) { messages.Add(validationMessage); } } } return(Merge(messages)); }
/// <summary> /// Validates the specified property of the specified validation source for the specified property value in specified validation context by using validation attributes. /// </summary> /// <param name="validationSource">The validation source.</param> /// <param name="propertyName">The property name.</param> /// <param name="propertyValue">The property value.</param> /// <param name="validationContext">The validation context.</param> /// <returns> /// The collection of validation mesasges. /// </returns> public static ValidationMessageCollection ValidateAttributes(this IValidatable validationSource, string propertyName, object propertyValue, string validationContext) { validationSource.CannotBeNull(); propertyName.CannotBeNullOrEmpty(); ValidationMessageCollection messages = new ValidationMessageCollection(); var validationAttributes = ReflectionExtensions.GetProperties(validationSource.GetType())[propertyName].ValidationAttributes; bool isValid; // perform attribute based validation foreach (var validationAttribute in validationAttributes) { // only matching validation context gets validated if (validationAttribute.ValidationContext == validationContext) { // custom validators might cause exceptions that are hard to find try { isValid = validationAttribute.IsValid(propertyValue); } catch (Exception ex) { throw new ValidationErrorException("Unhandled validation exception occurred.", validationAttribute.GetType(), validationSource.GetType(), propertyName, ex); } if (!isValid) { var messageKey = validationAttribute.MessageKey ?? validationAttribute.GetDefaultMessageKey() ?? "UndefinedMessageKey"; var message = validationAttribute.Message ?? validationAttribute.GetDefaultMessage() ?? "Undefined message."; var messageParameters = validationAttribute.MessageParameters; var validationLevel = validationAttribute.ValidationLevel; var validationPriority = validationAttribute.ValidationPriority; // value is invalid -> add it to the list messages.Add(new ValidationMessage(messageKey, message, messageParameters, validationSource, propertyName, validationLevel, validationContext, validationPriority)); } } } return(messages); }