smoro999 Ответов: 2

Как использовать аннотацию данных для проверки наличия двух значений.


Скажем например моя модель была

Год
Сделай
[Обязательным(Год != нуль)
Модель
[Обязательным(Год != null и сделать != нуль)
Отделка

Я использую .Объем основной для решения, и видели на примере для RequireIF но он проверяет только одно поле. Мне нужно несколько полей.

Спасибо
Стив

Что я уже пробовал:

public class RequiredIfAttribute : ValidationAttribute
    {

        RequiredAttribute _innerAttribute = new RequiredAttribute();
        private string _dependentProperty { get; set; }
        private object _targetValue { get; set; }

        public RequiredIfAttribute(string dependentProperty, object targetValue)
        {
            this._dependentProperty = dependentProperty;
            this._targetValue = targetValue;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var field = validationContext.ObjectType.GetProperty(_dependentProperty);
            if (field != null)
            {
                var dependentValue = field.GetValue(validationContext.ObjectInstance, null);
                if ((dependentValue == null && _targetValue == null) || (dependentValue.Equals(_targetValue)))
                {
                    if (!_innerAttribute.IsValid(value))
                    {
                        string name = validationContext.DisplayName;
                        return new ValidationResult(ErrorMessage = name + " Is required.");
                    }
                }
                return ValidationResult.Success;
            }
            else
            {
                return new ValidationResult(FormatErrorMessage(_dependentProperty));
            }
        }

2 Ответов

Рейтинг:
6

Benktesh Sharma

Поскольку вы хотите, чтобы несколько полей были частью атрибута проверки, гораздо проще передать массив параметров конструктору атрибута RequiredIf и выполнить цикл через поля для создания логики. Я сделал что-то подобное, и вот код.

Для упрощения я использовал один конструктор, и поэтому мне приходится передавать массив даже для одного поля, но это можно изменить.

Для проверки модели я передаю массив полей, как показано ниже:

[RequiredIf(new string[] {"Year", "Make"})]


Метод IsValid просто проходит через поля и проверяет. Проверка Null происходит в рамках логики проверки.

Дайте мне знать по любым вопросам.


Вот соответствующие коды.

public String Year { get; set; }

[RequiredIf(new string[] {"Year"})]
public String Make { get; set; }

[RequiredIf(new string[] {"Year", "Make"})]
public String Model { get; set; }

public String Trim { get; set; }


public class RequiredIfAttribute : ValidationAttribute
   {
       private const string DefaultErrorMessageFormatString = "The {0} field is required.";
       private readonly string[] _dependentProperties;

       public RequiredIfAttribute(string[] dependentProperties)
       {
           _dependentProperties = dependentProperties;
           ErrorMessage = DefaultErrorMessageFormatString;
       }

       protected override ValidationResult IsValid(Object value, ValidationContext context)
       {
           Object instance = context.ObjectInstance;
           Type type = instance.GetType();

           foreach (string s in _dependentProperties)
           {
               Object propertyValue = type.GetProperty(s).GetValue(instance, null);
               if (propertyValue == null || value != null)
               {
                   return ValidationResult.Success;
               }
           }
           return new ValidationResult(context.DisplayName + " required. ");
       }
   }


smoro999

Если бы я тоже хотел иметь эту работу

[Обязательным(год == ампер 2019 &;&амп; сделайте != нуль)
Отделка

Хотелось бы иметь возможность делать условные С и/или с фактическими значениями.

Заранее спасибо.
Стив

Benktesh Sharma

Спасибо Стив,
Я рад, что решение, которое я предложил, помогло вам. Чтобы получить решение, которое вам нужно, я считаю, что мы можем расширить атрибут, чтобы передать значения, а также оператор равенства. Позвольте мне немного поработать над этим и предоставить вам кое-что для начала. Спасибо.

Рейтинг:
19

Benktesh Sharma

Расширенное решение включает в себя передачу поля и требуемого значения. Здесь атрибут передает разделенный запятыми текст для передачи поля и значения. Каждая из этих пар считается "и".

[RequiredIf(new string[] {"Year,1994", "Make,!null"})]


В фактическом атрибуте мы анализируем пару значений и проверяем, требуется ли это значение для поля.

public class RequiredIfAttribute : ValidationAttribute
    {
        private const string DefaultErrorMessageFormatString = "The {0} field is required.";
        private readonly string[] _dependentProperties;

        public RequiredIfAttribute(string[] dependentProperties)
        {
            _dependentProperties = dependentProperties;
            ErrorMessage = DefaultErrorMessageFormatString;
        }

        private bool IsValueRequired(string checkValue, Object currentValue)
        {
            if (checkValue.Equals("!null", StringComparison.InvariantCultureIgnoreCase))
            {
                return currentValue != null;
            }

            return checkValue.Equals(currentValue);
        }

        protected override ValidationResult IsValid(Object value, ValidationContext context)
        {
            Object instance = context.ObjectInstance;
            Type type = instance.GetType();
            bool valueRequired = false;

            foreach (string s in _dependentProperties)
            {
                var fieldValue = s.Split(',').ToList().Select(k => k.Trim()).ToArray();

                Object propertyValue = type.GetProperty(fieldValue[0]).GetValue(instance, null);

                valueRequired = IsValueRequired(fieldValue[1], propertyValue);
            }

            if (valueRequired)
            {
                return value != null
                    ? ValidationResult.Success
                    : new ValidationResult(context.DisplayName + " required. ");
            }
            return ValidationResult.Success;
        }
    }


Обратите внимание, что проверка того, имеет ли поле нулевое значение, включает в себя некоторый синтаксический анализ строк. В приведенном выше решении я предполагаю оператор "и" для всех пар значений полей. Приведенное выше решение может быть расширено для добавления оператора равенства.


smoro999

Спасибо, что это работает. Цените направление и помощь.

Benktesh Sharma

Замечательный. Спасибо.