我有一个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来做这件事。
非常感谢
布赖恩
答案 0 :(得分:1)
您正在寻找客户端验证 - 这并非特定于FluentValidation或DataAnnotations。这两种机制都将自动在服务器端工作(您必须将FluentValidation连接到模型绑定后自动执行此操作,或手动运行)。
如果您希望使用ASP.NET MVC进行客户端验证,那么您也必须将这一点连接起来。 This博客条目可能有所帮助。
但需要注意的是 - 您的自定义验证程序默认不起作用(您必须在客户端的jQuery中复制该验证)。查看有关FluentValidation的this文章;这是一个摘录,显示验证者应该"只是工作"客户端没有重写你自己:
请注意,FluentValidation也适用于ASP.NET MVC 客户端验证,但并非所有规则都受支持。例如, 使用条件定义的任何规则(使用When / unless),自定义 验证器或对Must的调用不会在客户端运行。该 客户端支持以下验证器:
* NOTNULL / NotEmpty
*匹配(正则表达式)
* InclusiveBetween(范围)
*信用卡式
*电子邮件
* EqualTo(跨属性相等比较)
*长度