/// <summary>
        /// Actual implementation how to validate the specified object.
        /// </summary>
        /// <param name="contextParams">Additional context parameters.</param>
        /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
        /// <param name="validationContext">The object to validate.</param>
        /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
        protected override bool ValidateGroup(IDictionary<string, object> contextParams, IValidationErrors errors, object validationContext)
        {
            ValidationErrors tmpErrors = new ValidationErrors();
            bool valid = false;
            foreach (IValidator validator in Validators)
            {
                bool tmpValid = validator.Validate(validationContext, contextParams, tmpErrors);
                if (valid && tmpValid)
                {
                    valid = false;
                    if (this.FastValidate)
                    {
                        break;
                    }
                }
                else if (tmpValid)
                {
                    valid = true;
                }
            }

            if (!valid)
            {
                errors.MergeErrors(tmpErrors);
            }

            return valid;            
        }
        /// <summary>
        /// Gets or sets a flag specifying whether this binding is valid.
        /// </summary>
        /// <value>
        ///     <c>true</c> if this binding evaluated without errors;
        ///     <c>false</c> otherwise.
        /// </value>
        public bool IsValid(IValidationErrors errors)
        {
            if (errors == null) return true;

            IList errorList = errors.GetErrors(ALL_BINDINGERRORS_PROVIDER);
            return (errorList == null) || (!errorList.Contains(this.ErrorMessage));
        }
        /// <summary>Constructor</summary>
        /// <param name="errors">Validation errors</param>
        public ValidationException(IValidationErrors errors)
            : base(errors.ToExceptionMessage())
        {
            Checker.ArgumentIsNull(errors, "errors");

            Errors = errors;
        }
 /// <summary>
 /// 把錯誤訊息記錄到IValidationDictionary的物件裡面
 /// </summary>
 /// <param name="validationDictionary">儲存目前Validation結果的Dictionary</param>
 /// <param name="propertyErrors">要記錄到ValidationDictionary裡面的錯誤訊息</param>
 public static void AddValidationErrors(this IValidationDictionary validationDictionary, IValidationErrors propertyErrors)
 {
     foreach (var databaseValidationError in propertyErrors.Errors)
     {
         validationDictionary.AddError(databaseValidationError.PropertyName, databaseValidationError.PropertyExceptionMessage);
     }
 }
 /// <summary>
 /// Called when associated validator is invalid.
 /// </summary>
 /// <param name="validationContext">Validation context.</param>
 /// <param name="contextParams">Additional context parameters.</param>
 /// <param name="errors">Validation errors container.</param>
 protected override void OnInvalid(object validationContext, IDictionary<string, object> contextParams, IValidationErrors errors)
 {
     ErrorMessage error = CreateErrorMessage(validationContext, contextParams);
     foreach (string provider in this.providers)
     {
         errors.AddError(provider.Trim(), error);
     }
 }
Example #6
0
 protected void ConsumeErrors(IValidationErrors errors)
 {
     //ModelState.Clear();
     foreach (IValidationError error in errors)
     {
         ConsumeError(error);
     }
 }
Example #7
0
        /// <summary>
        /// Binds target object to source object.
        /// </summary>
        /// <param name="source">
        ///   The source object.
        /// </param>
        /// <param name="target">
        ///   The target object.
        /// </param>
        /// <param name="validationErrors">
        ///   Validation errors collection that type conversion errors should be added to.
        /// </param>
        /// <param name="variables">
        ///   Variables that should be used during expression evaluation.
        /// </param>
        public override void BindTargetToSource(object source, object target, IValidationErrors validationErrors, IDictionary<string, object> variables)
        {
            if (variables == null)
            {
                variables = new Dictionary<string, object>();
            }
            variables["source"] = source;
            variables["target"] = target;

            sourceExpression.GetValue(null, variables);
        }
        /// <summary>
        /// Binds source object to target object.
        /// </summary>
        /// <param name="source">
        /// The source object.
        /// </param>
        /// <param name="target">
        /// The target object.
        /// </param>
        /// <param name="validationErrors">
        /// Validation errors collection that type conversion errors should be added to.
        /// </param>
        /// <param name="variables">
        /// Variables that should be used during expression evaluation.
        /// </param>
        public override void BindSourceToTarget(object source, object target, IValidationErrors validationErrors,
                                                IDictionary variables)
        {
            if (variables == null)
            {
                variables = new Hashtable();
            }
            variables["source"] = source;
            variables["target"] = target;

            targetExpression.GetValue(null, variables);
        }
 /// <summary>
 /// Marks this binding's state as invalid for this validationErrors collection. 
 /// Returns false if <paramref name="validationErrors"/> is null.
 /// </summary>
 /// <param name="validationErrors"></param>
 /// <returns>false, if validationErrors is null</returns>
 protected bool SetInvalid(IValidationErrors validationErrors)
 {
     if (validationErrors != null)
     {
         foreach (string provider in this.ErrorProviders)
         {
             validationErrors.AddError(provider, this.ErrorMessage);
         }
         return true;
     }
     return false;
 }
Example #10
0
 /// <summary>
 /// Actual implementation how to validate the specified object.
 /// </summary>
 /// <param name="validationContext">The object to validate.</param>
 /// <param name="contextParams">Additional context parameters.</param>
 /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
 /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
 protected override bool ValidateGroup(IDictionary contextParams, IValidationErrors errors, object validationContext)
 {
     bool valid = true;
     foreach (IValidator validator in this.Validators)
     {
         valid = validator.Validate(validationContext, contextParams, errors) && valid;
         if (!valid && this.FastValidate)
         {
             break;
         }
     }
     return valid;
 }
 /// <summary>
 /// Executes the action.
 /// </summary>
 /// <param name="isValid">Whether associated validator is valid or not.</param>
 /// <param name="validationContext">Validation context.</param>
 /// <param name="contextParams">Additional context parameters.</param>
 /// <param name="errors">Validation errors container.</param>
 public virtual void Execute(bool isValid, object validationContext, IDictionary contextParams, IValidationErrors errors)
 {
     if (EvaluateWhen(validationContext, contextParams))
     {
         if (isValid)
         {
             OnValid(validationContext, contextParams, errors);
         }
         else
         {
             OnInvalid(validationContext, contextParams, errors);
         }
     }
 }
 /// <summary>
 /// Binds source object to target object.
 /// </summary>
 /// <param name="source">
 ///   The source object.
 /// </param>
 /// <param name="target">
 ///   The target object.
 /// </param>
 /// <param name="validationErrors">
 ///   Validation errors collection that type conversion errors should be added to.
 /// </param>
 /// <param name="variables">
 ///   Variables that should be used during expression evaluation.
 /// </param>
 public override void BindSourceToTarget(object source, object target, IValidationErrors validationErrors, IDictionary<string, object> variables)
 {
     if (this.IsValid(validationErrors)
         && (this.Direction == BindingDirection.Bidirectional || this.Direction == BindingDirection.SourceToTarget))
     {
         try
         {
             DoBindSourceToTarget(source, target, variables);
         }
         catch (Exception)
         {
             if (!SetInvalid(validationErrors)) throw;
         }
     }
 }
Example #13
0
        /// <summary>
        /// Validates the specified object.
        /// </summary>
        /// <param name="contextParams">Additional context parameters.</param>
        /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
        /// <param name="validationContext">The object to validate.</param>
        /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
        protected override bool ValidateGroup(IDictionary<string, object> contextParams, IValidationErrors errors, object validationContext)
        {
            // capture errors in separate collection to only add them to the error collector in case of errors
            ValidationErrors tmpErrors = new ValidationErrors();
            bool valid = false;
            foreach (IValidator validator in Validators)
            {
                valid = validator.Validate(validationContext, contextParams, tmpErrors) || valid;
                if (valid && FastValidate)
                {
                    break;
                }
            }

            if (!valid)
            {
                errors.MergeErrors(tmpErrors);
            }
            return valid;
        }
Example #14
0
 /// <summary>
 /// Called when associated validator is invalid.
 /// </summary>
 /// <param name="validationContext">Validation context.</param>
 /// <param name="contextParams">Additional context parameters.</param>
 /// <param name="errors">Validation errors container.</param>
 protected override void OnInvalid(object validationContext, IDictionary<string, object> contextParams, IValidationErrors errors)
 {
     if (throwsExpression != null)
     {
         object o = null;
         try
         {
             o = throwsExpression.GetValue(null, contextParams);
         }
         catch (Exception e)
         {
             log.Error("Was not able to evaluate action expression [" + throwsExpression + "]", e);
         }
         Exception exception = o as Exception;
         if (exception != null)
         {
             throw exception;
         }                
     }          
     throw new ValidationException(errors);
 }
Example #15
0
        /// <summary>
        /// Merges another instance of <see cref="ValidationErrors"/> into this one.
        /// </summary>
        /// <remarks>
        /// <p>
        /// If the supplied <paramref name="errorsToMerge"/> is <see lang="null"/>,
        /// then no errors will be added to this instance, and this method will
        /// (silently) return.
        /// </p>
        /// </remarks>
        /// <param name="errorsToMerge">
        /// The validation errors to merge; can be <see lang="null"/>.
        /// </param>
        public void MergeErrors(IValidationErrors errorsToMerge)
        {
            if (errorsToMerge != null)
            {
                foreach(string provider in errorsToMerge.Providers)
                {
                    List<ErrorMessage> errList;
                    List<ErrorMessage> other = new List<ErrorMessage>(errorsToMerge.GetErrors(provider));
                    if (!errorMap.TryGetValue(provider, out errList))
                    {
                        this.errorMap[provider] = other;
                    }
                    else
                    {
                        errList.AddRange(other);
                    }
                }
//                foreach (DictionaryEntry errorEntry in errorsToMerge.errorMap)
//                {
//                    ArrayList errList = (ArrayList) this.errorMap[errorEntry.Key];
//                    if (errList == null)
//                    {
//                        this.errorMap[errorEntry.Key] = errorEntry.Value;
//                    }
//                    else
//                    {
//                        errList.AddRange((IList) errorEntry.Value);
//                    }
//                }
            }
        }
 /// <summary>
 /// Binds target object to source object.
 /// </summary>
 /// <param name="source">
 /// The source object.
 /// </param>
 /// <param name="target">
 /// The target object.
 /// </param>
 /// <param name="validationErrors">
 /// Validation errors collection that type conversion errors should be added to.
 /// </param>
 /// <param name="variables">
 /// Variables that should be used during expression evaluation.
 /// </param>
 public abstract void BindTargetToSource(object source, object target, IValidationErrors validationErrors, IDictionary variables);
 /// <summary>
 /// Actual implementation how to validate the specified object.
 /// </summary>
 /// <param name="validationContext">The object to validate.</param>
 /// <param name="contextParams">Additional context parameters.</param>
 /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
 /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
 protected abstract bool ValidateGroup(IDictionary contextParams, IValidationErrors errors, object validationContext);
Example #18
0
        /// <summary>
        /// Validates the specified object.
        /// </summary>
        /// <param name="validationContext">The object to validate.</param>
        /// <param name="contextParams">Additional context parameters.</param>
        /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
        /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
        public bool Validate(object validationContext, IDictionary contextParams, IValidationErrors errors)
        {
            bool valid = true;

            if (When == null || 
                Convert.ToBoolean(When.GetValue(validationContext, contextParams)))
            {
                if (Context != null)
                {
                    validationContext = Context.GetValue(validationContext, contextParams);
                }
                if (validator == null)
                {
                    validator = (IValidator)objectFactory.GetObject(Name);
                }
                valid = validator.Validate(validationContext, contextParams, errors);
            }

            return valid;
        }
 /// <summary>
 /// Binds target object to source object.
 /// </summary>
 /// <param name="source">
 /// The source object.
 /// </param>
 /// <param name="target">
 /// The target object.
 /// </param>
 /// <param name="validationErrors">
 /// Validation errors collection that type conversion errors should be added to.
 /// </param>
 public virtual void BindTargetToSource(object source, object target, IValidationErrors validationErrors)
 {
     BindTargetToSource(source, target, validationErrors, null);
 }
        /// <summary>
        /// Actual implementation how to validate the specified object.
        /// </summary>
        /// <param name="validationContext">The object to validate.</param>
        /// <param name="contextParams">Additional context parameters.</param>
        /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
        /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
        protected override bool ValidateGroup(IDictionary contextParams, IValidationErrors errors, object validationContext)
        {
            bool valid = true;
            IEnumerable collectionToValidate = (validationContext is IDictionary
                ? ((IDictionary) validationContext).Values
                : (IEnumerable) validationContext);

            // decide whether to pass new validation errors collection
            //(and discard error messages returned by the item validators)
            // OR to pass validation errors collection that was passed to this method
            //(and collect all error messages returned by the item validators)
            IValidationErrors err = (includeElementErrors)? errors : new ValidationErrors();

            foreach (object objectToValidate in collectionToValidate)
            {
                foreach (IValidator validator in this.Validators)
                {
                    valid = validator.Validate(objectToValidate, contextParams, err) && valid;
                    if (!valid && this.FastValidate)
                    {
                        break;
                    }
                }

                if (!valid && this.FastValidate)
                {
                    break;
                }
            }
            return valid;
        }
Example #21
0
 /// <summary>
 /// Validates the specified object.
 /// </summary>
 /// <param name="validationContext">The object to validate.</param>
 /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
 /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
 public bool Validate(object validationContext, IValidationErrors errors)
 {
     return Validate(validationContext, null, errors);
 }
 /// <summary>
 /// Processes the error messages.
 /// </summary>
 /// <param name="isValid">Whether validator is valid or not.</param>
 /// <param name="validationContext">Validation context.</param>
 /// <param name="contextParams">Additional context parameters.</param>
 /// <param name="errors">Validation errors container.</param>
 protected void ProcessActions(bool isValid, object validationContext, IDictionary contextParams, IValidationErrors errors)
 {
     if (actions != null && actions.Count > 0)
     {
         foreach (IValidationAction action in actions)
         {
             action.Execute(isValid, validationContext, contextParams, errors);
         }
     }
 }
        /// <summary>
        /// Validates the specified collection of objects.
        /// If the <c>IncludeElementErrors</c> property was set to <c>true</c>, 
        /// <paramref name="errors"/> collection will contain a union of all validation error messages 
        /// for the contained validators; 
        /// Otherwise it will contain only error messages that were set for this Validator.
        /// </summary>
        /// <param name="validationContext">The collection to validate.</param>
        /// <param name="contextParams">Additional context parameters.</param>
        /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
        /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
        public override bool Validate(object validationContext, IDictionary contextParams, IValidationErrors errors)
        {
            if (Context != null)
            {
                validationContext = Context.GetValue(validationContext, contextParams);
            }

            if (!(validationContext is IEnumerable))
            {
                throw new ArgumentException("The type of the object for validation must be subtype of IEnumerable.");
            }

            return base.Validate(validationContext, contextParams, errors);
        }
        /// <summary>
        /// Validates the specified object.
        /// </summary>
        /// <param name="validationContext">The object to validate.</param>
        /// <param name="contextParams">Additional context parameters.</param>
        /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
        /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
        public override bool Validate(object validationContext, IDictionary contextParams, IValidationErrors errors)
        {
            if (EvaluateWhen(validationContext, contextParams))
            {
                bool valid = ValidateGroup(contextParams, errors, validationContext);
                ProcessActions(valid, validationContext, contextParams, errors);
                return valid;
            }

            return true;
        }
 /// <summary>
 /// Validates the specified object.
 /// </summary>
 /// <param name="validationContext">The object to validate.</param>
 /// <param name="contextParams">Additional context parameters.</param>
 /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
 /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
 public abstract bool Validate(object validationContext, IDictionary contextParams, IValidationErrors errors);
 // CLOVER:OFF
 /// <summary>
 /// Called when associated validator is valid.
 /// </summary>
 /// <param name="validationContext">Validation context.</param>
 /// <param name="contextParams">Additional context parameters.</param>
 /// <param name="errors">Validation errors container.</param>
 protected virtual void OnValid(object validationContext, IDictionary contextParams, IValidationErrors errors)
 {
 }
Example #27
0
 /// <summary>
 /// Called when associated validator is valid.
 /// </summary>
 /// <param name="validationContext">Validation context.</param>
 /// <param name="contextParams">Additional context parameters.</param>
 /// <param name="errors">Validation errors container.</param>
 protected override void OnValid(object validationContext, IDictionary contextParams, IValidationErrors errors)
 {
     if (Valid != null)
     {
         Valid.GetValue(validationContext, contextParams);
     }
 }
        /// <summary>
        /// Validates the specified object.
        /// </summary>
        /// <param name="validationContext">The object to validate.</param>
        /// <param name="contextParams">Additional context parameters.</param>
        /// <param name="errors"><see cref="ValidationErrors"/> instance to add error messages to.</param>
        /// <returns><c>True</c> if validation was successful, <c>False</c> otherwise.</returns>
        public override bool Validate(object validationContext, IDictionary<string, object> contextParams, IValidationErrors errors)
        {
            bool valid = true;

            if (EvaluateWhen(validationContext, contextParams))
            {
                valid = Validate(EvaluateTest(validationContext, contextParams));
                ProcessActions(valid, validationContext, contextParams, errors);
            }

            return valid;
        }
        private void WhenMultipleValidatorsReturnTrue(ExclusiveValidatorGroup vg, IValidationErrors errors)
        {
            vg.Actions.Add(new ErrorMessageAction("exclusiveError", "exclusiveErrors"));

            vg.Validators.Add(new FalseValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new FalseValidator());

            errors.AddError("existingErrors", new ErrorMessage("error", null));

            bool valid = vg.Validate(new object(), errors);

            Assert.IsFalse(valid, "Validation should not succeed when multiple inner validators return true.");
            Assert.AreEqual(1, errors.GetErrors("exclusiveErrors").Count);
            Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);
        }
 /// <summary>
 /// Binds target object to source object.
 /// </summary>
 /// <param name="source">
 /// The source object.
 /// </param>
 /// <param name="target">
 /// The target object.
 /// </param>
 /// <param name="validationErrors">
 /// Validation errors collection that type conversion errors should be added to.
 /// </param>
 /// <param name="variables">
 /// Variables that should be used during expression evaluation.
 /// </param>
 public override void BindTargetToSource(object source, object target, IValidationErrors validationErrors,
                                         IDictionary variables)
 {
     if (this.IsValid(validationErrors)
         && (this.Direction == BindingDirection.Bidirectional || this.Direction == BindingDirection.TargetToSource))
     {
         try
         {
             DoBindTargetToSource(source, target, variables);
         }
         catch (Exception ex)
         {
             log.Warn(string.Format("Failed binding[{0}]:{1}", this.Id, ex));
             if (!SetInvalid(validationErrors)) throw;
         }
     }
 }