Блок проверки библиотеки предприятия для Nullable <DateTime> - PullRequest
0 голосов
/ 14 марта 2011

Я играю с блоком проверки Enterprise Library.У меня есть класс из EDMX-файла Linq To Entities, который я использую в проекте MVC.Я хочу убедиться, что Nullable DateTime всегда позже, чем DateTime.Я использую атрибуты в классе метаданных для создания набора правил по умолчанию.При попытке проверки с помощью PropertyComparisonValidator я получаю исключение:

Атрибут проверки типа PropertyComparisonValidatorAttribute нельзя использовать для проверки значений.

Я предположил, что не смогсравните тип Nullable со структурой, поэтому я специально написал специальный класс ниже, чтобы обойти эту проблему.Тем не менее я получаю это исключение:

Атрибут проверки типа NullableDateComparisonValidatorAttribute не может использоваться для проверки значений.

Далее я попытался выполнить самопроверку из библиотеки предприятия, но это не удалосьогонь при проверке.Я нахожусь во временном бездействии, пока не выясню это.Пожалуйста, предложите решение \ обходной путь, который не слишком уродлив.

using System;
using System.Reflection;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

namespace IdahoUtility
{
    public class NullableComparisonValidator<T> : Validator<Nullable<T>>
        where T: struct, IComparable
    {
        protected string propertyToCompare { get; set; }
        protected ComparisonOperator comparisionOperator { get; set; }
        protected T TargetProperty(object currentTarget)
        {
            if (null == currentTarget)
            {
                throw new ArgumentNullException("currentTarget");
            }

            Type t = currentTarget.GetType();
            PropertyInfo pInfo = t.GetProperty(propertyToCompare);
            object oValue = pInfo.GetValue(currentTarget, null);

            if (oValue.GetType() != typeof(T))
            {
                throw new InvalidOperationException(string.Format("Property compared must be a {0}!",typeof(T)));
            }

            return (T)oValue;
        }
        public NullableComparisonValidator(string PropertyToCompare, ComparisonOperator cmpOp)
            :base(null,null)
        {
            if (string.IsNullOrWhiteSpace(PropertyToCompare))
            {
                throw new ArgumentException("PropertyToCompare is Invalid!", "PropertyToCompare");
            }
            propertyToCompare = PropertyToCompare;
            comparisionOperator = cmpOp;
        }
        protected override void DoValidate(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults)
        {
            // ignore nulls
            if (null == objectToValidate)
            {
                return;
            }

            switch (comparisionOperator)
            {
                case ComparisonOperator.Equal:
                    DoValidateEqual(objectToValidate, currentTarget, key, validationResults);
                    break;
                case ComparisonOperator.GreaterThan:
                    DoValidateGreaterThan(objectToValidate, currentTarget, key, validationResults);
                    break;
                case ComparisonOperator.GreaterThanEqual:
                    DoValidateGreaterThanEqual(objectToValidate, currentTarget, key, validationResults);
                    break;
                case ComparisonOperator.LessThan:
                    DoValidateLessThan(objectToValidate, currentTarget, key, validationResults);
                    break;
                case ComparisonOperator.LessThanEqual:
                    DoValidateLessThanEqual(objectToValidate, currentTarget, key, validationResults);
                    break;
                case ComparisonOperator.NotEqual:
                    DoValidateNotEqual(objectToValidate, currentTarget, key, validationResults);
                    break;             
            }
        }

        private void DoValidateLessThanEqual(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults)
        {
            if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) > 0)
            {
                LogValidationResult(validationResults, string.Format("Should be less than or equal to {0}!", propertyToCompare), currentTarget, key);
            }
        }

        private void DoValidateLessThan(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults)
        {
            if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) >= 0)
            {
                LogValidationResult(validationResults, string.Format("Should be less than {0}!", propertyToCompare), currentTarget, key);
            }
        }

        private void DoValidateGreaterThanEqual(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults)
        {
            if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) < 0)
            {
                LogValidationResult(validationResults, string.Format("Should be greater than or equal {0}!", propertyToCompare), currentTarget, key);
            }
        }

        private void DoValidateGreaterThan(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults)
        {
            if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) <= 0)
            {
                LogValidationResult(validationResults, string.Format("Should be greater than {0}!", propertyToCompare), currentTarget, key);
            }
        }

        private void DoValidateEqual(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults)
        {
            if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) != 0)
            {
                LogValidationResult(validationResults, string.Format("Should be equal to {0}!", propertyToCompare), currentTarget, key);
            }
        }

        private void DoValidateNotEqual(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults)
        {
            if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) == 0)
            {
                LogValidationResult(validationResults, string.Format("Should not be equal to {0}!", propertyToCompare), currentTarget, key);
            }
        }

        protected override string DefaultMessageTemplate
        {
            get { return "{0}"; }
        }
    }
}

1 Ответ

0 голосов
/ 15 марта 2011

Проблема не имеет ничего общего с тем, что это тип nullable. Я полностью переработал Валидацию. Я удалил классы метаданных с атрибутами и переместил проверку в конфигурацию с помощью инструмента Enterprise Library. Я наконец смог использовать Валидатор сравнения свойств, чтобы убедиться, что дата окончания следует за датой начала. Последняя загвоздка заключалась в том, что я не мог использовать набор правил по умолчанию. Я использую это на веб-сайте ASP.NET MVC и смог выполнить проверку на стороне клиента с помощью Enterprise Library. Я на самом деле очень доволен всем этим, даже если мне непонятно, почему оригинальная установка не сработала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...