如何使用FluentValidation显示其中一个或多个字段的UI错误

时间:2012-03-14 16:26:56

标签: fluentvalidation

我有一个MVC 3应用程序,它使用FluentValidation来表达某些ViewModel对象的验证逻辑。

其中一个对象有两个属性如下:

  [DisplayNameAttribute(UiConstants.Telephone)]
  public string Telephone { get; set; }

  [DisplayNameAttribute(UiConstants.Email)]
  public string Email { get; set; }

规则是必须在UI中输入这些属性,并且我希望UI在用户点击提交但不进行PostBack时显示至少一个字段(Email)的验证消息。

我可以使用验证器

中的以下代码进行验证
               RuleFor(contact => contact.Email)
                .Must((contact, email) => string.IsNullOrWhiteSpace(email) != string.IsNullOrWhiteSpace(contact.Telephone))
                .WithMessage(ValidationConstants.EmailOrTelephone);

这将在UI上显示我的验证错误消息,但仅在PostBack之后显示。

我还使用了自定义验证器,如下所示

            Custom(contactUs =>
            {
                return string.IsNullOrWhiteSpace(contactUs.Telephone) && string.IsNullOrWhiteSpace(contactUs.Email)
                    ? new ValidationFailure("Email", ValidationConstants.EmailOrTelephone)
                    : null;
            });

但这种行为方式相同。

这不会像我希望的那样工作吗?

是否有另一种方法可以使验证程序在不进行PostBack的情况下在UI中显示错误消息?

我知道我也可以使用DataAnnotations但我特别想用FluentValidation来做这件事。

非常感谢

布赖恩

1 个答案:

答案 0 :(得分:1)

您正在寻找客户端验证 - 这并非特定于FluentValidation或DataAnnotations。这两种机制都将自动在服务器端工作(您必须将FluentValidation连接到模型绑定后自动执行此操作,或手动运行)。

如果您希望使用ASP.NET MVC进行客户端验证,那么您也必须将这一点连接起来。 This博客条目可能有所帮助。

但需要注意的是 - 您的自定义验证程序默认不起作用(您必须在客户端的jQuery中复制该验证)。查看有关FluentValidation的this文章;这是一个摘录,显示验证者应该"只是工作"客户端没有重写你自己:

  

请注意,FluentValidation也适用于ASP.NET MVC   客户端验证,但并非所有规则都受支持。例如,   使用条件定义的任何规则(使用When / unless),自定义   验证器或对Must的调用不会在客户端运行。该   客户端支持以下验证器:

     

* NOTNULL / NotEmpty

     

*匹配(正则表达式)

     

* InclusiveBetween(范围)

     

*信用卡式

     

*电子邮件

     

* EqualTo(跨属性相等比较)

     

*长度