/// <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));
        }
Ejemplo n.º 2
0
        /// <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);
        }