Fluent Validation 无法按预期使用 .Equal() 测试

Fluent Validation not working as expected with .Equal() test

我已经为客户视图模型创建了 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 table 中。我通过在页面 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 非侵入式验证的内容后,我在 Razor 网页上制作了 EmailExists 标签,直到我弄清楚为什么它没有报告正确的状态。

当电子邮件存在时:

因此您可以看到,无论结果(0 或 1)是什么,FV 规则都报告相同的消息。

有什么帮助吗?我试过使用布尔值,结果大致相同。我所有的其他验证都成功了,所以我想我可能没有使用正确的检查?

一如既往,提前致谢。

这是呈现的代码:

这是屏幕截图:

这里是修改后的 RuleFor:

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 或 ) 以及电子邮件是否存在时得到相同的行为..:[=​​20=]

问题在于我试图在 POST 方法中影响模型,然后再为 Customer 模型调用 FluentValidation 验证器。虽然看起来我可以更新模型,并在调试时看到它在 IDE 中更新,并将更新的值传递回视图,但更新没有发生。

我通过传递一个连接到我正在测试的电子邮件地址的随机字符串来测试这个。 这证实了虽然看起来模型正在通过我的检查进行更新,但事实并非如此。 Grr.

为了解决这个问题,我在流式验证之外向模型状态添加了一个错误:

public virtual ActionResult AddCustomer(CustomerAddViewModel model)
{            
    if (!string.IsNullOrEmpty(model.Email))
    {
      var exists = _userService.UserExists(model.Email);
      if (exists) 
      { 
        ModelState.AddModelError("Email", "Email Already Exists"); 
       }
    }
}

然后像往常一样使用 HTMl 助手发布错误消息:

@Html.ValidationMessageFor(x => x.Email, "", new { @class = "help-block" })

我不明白为什么我不能在执行验证之前影响模型,但在逐步执行代码时仍然可以看到这些问题,这使得它比应该的要冗长得多。