C # Сбой при совместном использовании ValidationContext для разных атрибутов ValidationAttribute

#c# #asp.net-core-webapi #model-validation #validationattribute

#c# #asp.net-core-webapi #модель-проверка #атрибут validationattribute

Вопрос:

Хотите применить проверку к входной модели, используя ряд пользовательских атрибутов проверки, как указано ниже.

Если результат проверки первого атрибута проверки, т.Е. «ValidatorAttributeOne», является истинным, то нет необходимости обрабатывать логику проверки «ValidatorAttributeTwo».

Для достижения этого допустимого результата «ValidationAttributeOne» присваивается «ValidationContext.Словарь элементов, полагающий, что «ValidationContext» будет совместно использоваться для разных «атрибутов ValidationAttributes» в одном и том же http-запросе, но строка ниже всегда выдает исключение ниже

 var isDependedFilterValidated = (bool?)validationContext.Items[dependedFilter]
  

«сообщение»: «Данный ключ’ValidationAttributeOne’ отсутствовал в словаре».,

 public class ValidatorAttributeOne : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
       //custom validation

        validationContext.Items["ValidatorAttributeOne"] = true;
        return ValidationResult.Success;
    }
}


public class ValidatorAttributeTwo : ValidationAttribute
{
    private readonly string dependedFilter = default(string);

    public UsernamesEmailValidatorAttribute()
    {           
    }

    public UsernamesEmailValidatorAttribute(string filter)
    {
        dependedFilter = filter;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var isDependedFilterValidated = (bool?)validationContext.Items[dependedFilter];

        if (isDependedFilterValidated == false)
        {
            //custom validation logic                
        }

        return ValidationResult.Success;
    }
}

public class CustomeModel
{ 
    [ValidatorAttributeOne ]
    [ValidatorAttributeTwo("ValidatorAttributeOne")] 
    public string usernames { get; set; }      
}  
  

Ответ №1:

Во-первых, два пользовательских атрибута проверки не могут совместно использовать ValidationContext, если вы не хотите этого делать validationContext , когда первый из них имеет значение true.Вы можете установить содержимое метода isValid для двух атрибутов validationAttributes вместе.

Например:

 public class ValidationAttributeThree : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            
            if (ValidationAttributeOne IsValid method Content is true) {
                return ValidationResult.Success;
             }
            else if(ValidationAttributeTwo IsValid method Content is true){
               return new ValidationResult("ValidationAttributeOne error message");
            }else{
                return new ValidationResult("ValidationAttributeOne error message" "ValidationAttributeTwo error message");
            }
                
        }
    }