我已经为客户视图模型创建了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!");
});
因此,要进行的工作是对电子邮件进行测试以确保其不为null且为真实电子邮件格式。然后,如果通过此测试,则从属规则将检查另一个字段,以确保该电子邮件在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网页上的标签,直到我弄清楚为什么它未报告正确的状态。
以及电子邮件存在时:
因此,无论结果(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或的情况下我会得到相同的行为,并且无论电子邮件是否存在..:
答案 0 :(得分:0)
问题在于我试图影响POST方法中的模型,然后再调用Customer模型的FluentValidation验证程序。看来我可以更新模型,并在调试时在IDE中看到它已更新,并将更新后的值传回视图,但更新没有发生。
我通过传递连接到我正在测试的电子邮件地址的随机字符串来对此进行了测试。 这证实了,尽管看起来该模型正在用我的支票进行更新,但事实并非如此。嗯。
为解决该问题,我改用了流利的验证,但在模型状态中添加了一个错误:
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 Helper发布错误消息:
@Html.ValidationMessageFor(x => x.Email, "", new { @class = "help-block" })
我不明白为什么在进行验证之前我不能影响模型,但是在遍历代码时仍然可以看到错误之处,这使它变得比预期的要冗长得多。