Валидатор FluentValidation .Empty () не выполняется должным образом - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть очень простой класс валидатора, который я включил ниже. Этот класс валидатора проверяет QuestionAnswer объект, чтобы убедиться, что его свойства действительны.

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

Например, если вопрос Y является условным для вопроса X, а ответ X является нулевым, то ответ Y также должен быть нулевым.

Это то, что последнее правило в валидаторе было написано для проверки. Однако это правило не выполняется, когда я передаю QuestionAnswer, который зависит от предыдущего вопроса, но не ответил на предыдущий вопрос. Например, следующий ввод:

Подтверждение 100

Id:100
Section: 6
Type: no-type
Required: True
Text: Question 100
Answer: Mr
Conditional Question Id: 99
Conditional Question Answer:

Вышеупомянутый QuestionAnswer объект проходит проверку без ошибок, однако, как мы можем видеть, вопрос обусловлен вопросом 99, на который не был дан ответ, и, следовательно, он должен не пройти проверку.

ВопросОтвет класса

class QuestionAnswer
    {
        private string _type;

        public int Id { get; set; }
        public string Text { get; set; }

        public string Type
        {
            get => _type;
            set => _type = ConvertFromJsonType(value);
        }
        public bool Required { get; set; }

        public int Section { get; set; }

        public string Answer { get; set; }

        public string ConditionalQuestionId { get; set; }

        public string  ConditionalQuestionAnswered { get; set; }
}

ВопросОтветчик ответа

class FluentQuestionAnswerValidator : AbstractValidator<QuestionAnswer>
    {
        public FluentQuestionAnswerValidator()
        {
            RuleFor(qa => qa.Answer).NotNull()
                .When(qa => qa.Required == true)
                .WithMessage("This answer is required and cannot be null.");

            RuleFor(qa => qa.Answer).NotEmpty()
                .When(qa => qa.Required == true)
                .WithMessage("This answer is required and cannot be empty."); ;

            RuleFor(qa => qa.Answer).Must(IsNotNullOrWhiteSpace)
                .When(qa => qa.Required == true)
                .WithMessage("This answer is required and cannot be null or contain whitespace.");

            RuleFor(qa => qa.Answer).Empty()
                .When(qa => qa.ConditionalQuestionId != null && qa.ConditionalQuestionAnswered == null)
                .WithMessage("This question is required and conditional and therefore relies a previous question to be answered first.");

        }

        public bool IsNotNullOrWhiteSpace(string input)
        {
            if (string.IsNullOrWhiteSpace(input))
            {
                return false;
            }

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