public void AddValidationRule <TModel>(AbstractValidator <TModel> validator)
            where TModel : class
        {
            var genericType = validator.GetType().GetGenericArguments()[0];

            _validators.Add(genericType.Name, validator);
        }
Exemple #2
0
        public ValidatorDecorator(IValidator <TModel> validator, ValidatorCache cache)
        {
            _validator = (AbstractValidator <TModel>)validator;
            _cache     = cache;

            SetValidatorContextAsCustomState(_validator);
            cache.RegisterValidator(_validator);
            var addRuleMethod = _validator.GetType().GetMethod("AddRule", BindingFlags.Instance | BindingFlags.NonPublic);

            addRuleMethod.Invoke(_validator, new object[] { new DomainValidatorsValidator(GetRulesToValidate, GetAsyncRulesToValidate) });
        }
Exemple #3
0
        public static string GetJavascript <T>(AbstractValidator <T> validator)
        {
            var jsBuilder = new StringBuilder();

            jsBuilder.AppendLine(validator.GetType().Name + ":function (obj) { \r\n var errors = {}; \r\n Object.keys(obj).forEach(function(element) {\r\n errors[element] = []; \r\n });");
            var props = typeof(T).GetProperties();

            foreach (var property in props)
            {
                var propertyName = property.Name;
                foreach (var element in validator.CreateDescriptor().GetValidatorsForMember(propertyName))
                {
                    var parameters = new Dictionary <string, object>();
                    var errorKey   = element.GetType().Name;
                    switch (element)
                    {
                    case IComparisonValidator cv:
                        parameters.Add(nameof(cv.ValueToCompare), cv.ValueToCompare);
                        break;

                    case IBetweenValidator bv:
                        parameters.Add(nameof(bv.From), bv.From);
                        parameters.Add(nameof(bv.To), bv.To);
                        break;

                    case ILengthValidator lv:
                        parameters.Add(nameof(lv.Min), lv.Min);
                        parameters.Add(nameof(lv.Max), lv.Max);
                        break;
                    }

                    foreach (var converterType in TypeLookup[element.GetType()])
                    {
                        if (Activator.CreateInstance(converterType, args: element) is IJsConverterValidator converter)
                        {
                            jsBuilder.AppendLine(converter.GetJs(propertyName, errorKey, parameters));
                        }
                    }
                }
            }
            jsBuilder.AppendLine("return errors;\r\n},");
            return(jsBuilder.ToString());
        }
Exemple #4
0
        public static List <string> GetActualErrors <T>(T seedData, AbstractValidator <T> abstractValidator)
        {
            var errorsList = new List <string>();

            var abstractValidatorName = abstractValidator.GetType().Name;
            var js = JsConverter.GetJavascript(abstractValidator);

            js = js.Replace(abstractValidatorName + ":function", "function " + abstractValidatorName)
                 .Remove(js.LastIndexOf(",", StringComparison.Ordinal));

            var engine = new Engine().Execute(js);

            dynamic errorsResult = (engine.Invoke(abstractValidatorName, seedData)
                                    .ToObject() as IDictionary <string, object>)?
                                   .Values
                                   .FirstOrDefault();

            if (errorsResult != null)
            {
                errorsList.Add(errorsResult[0].errorKey.ToString());
            }

            return(errorsList);
        }