Я создал тест FluentValidation (FV) для модели представления клиента.
в модели тест:
{RuleFor(x => x.Email).NotNull().EmailAddress().WithMessage("Email format is Invalid").DependentRules(() => {
RuleFor(x => x.EmailExists).Equal(1).WithMessage("Email is already in use!");
});
Итак, что должно произойти, так это то, что электронная почта проверена на предмет ее ненулевого значения и является настоящим форматом электронной почты. Затем, если этот тест пройден, зависимое правило проверяет другое поле, чтобы убедиться, что электронная почта еще не существует в таблице AspNetUsers. Я сделал это, выполнив тест во время метода POST страницы, перед тем, как передать модель в валидатор для проверки, например:
if (!string.IsNullOrEmpty(model.Email))
{
var exists = _userService.UserExists(model.Email);
model.EmailExists = exists ? 1 : 0;
}
CustomerAddViewModelValidator validator = new CustomerAddViewModelValidator();
ValidationResult result = validator.Validate(model);
if (!result.IsValid)
{
model.ListTitles = GetTitlesList();
return View(model);
}
Пока все хорошо. Начальный тест для электронной почты работает, и он попадает в зависимую проверку, вот где его поведение становится странным:
Поведение:
Если я использую: RuleFor(x => x.EmailExists).Equal(1)
FV всегда сообщает, как будто электронная почта уже существует,
даже если электронная почта не
Если я использую RuleFor(x => x.EmailExists).Equal(0)
FV всегда сообщает, что электронная почта не существует, и не выдается предупреждение, даже если ввод электронной почты существует.
Первоначально я проводил этот тест на поле HiddenFor, но после прочтения ненавязчивой проверки JS я сделал EmailExists меткой на веб-странице Razor, пока не смог выяснить, почему она не сообщает о правильном состоянии.
и когда электронная почта существует:
Итак, вы можете видеть, что правило FV сообщает об одном и том же сообщении, независимо от результата (0 или 1).
Может ли помочь? Я пытался использовать логическое значение с почти такими же результатами. Все остальные мои проверки работают успешно, так что я думаю, что я не использую правильную проверку?
Как всегда, заранее спасибо.
это обработанный код:
и вот снимок экрана:
и вот исправленное правило для:
RuleFor(x => x.Email).NotNull().EmailAddress().WithMessage("Email format is Invalid").DependentRules(() => {
RuleFor(x => x.EmailExists).Equal(0).WithMessage("Email is already in use!");
});
Как видите, правило верное, но я получаю ЖЕ ПОВЕДЕНИЕ, ГДЕ РЕЗУЛЬТАТ 1 или), и независимо от того, существует электронная почта или нет ..: