有没有办法在第一次失败后停止DataAnnotation验证?

时间:2010-02-20 07:47:13

标签: asp.net-mvc validation data-annotations

在我的ViewModel中,我使用多个DataAnnotations来验证表单数据,每个字段通常有2-3个注释。

例如,电子邮件地址的字段可能如下所示:

[Required(ErrorMessage = "Please enter an email address.")]
[Email(ErrorMessage = "That is not a valid email address.")] // Custom
public string Email { get; set; }

现在,如果有人要提交表单,则两个错误都会显示在验证摘要中。是否有任何简单的方法来指定运行验证注释的顺序,以便在必需验证失败时,电子邮件验证不会运行?

如果无法做到这一点,通常如何处理?我应该为具有多个注释的任何字段创建自定义验证器吗?这是一种使用注释的正确方法,其中一个处理多种类型的验证吗?

(我也知道我可能会将必需的注释组合到自定义的电子邮件中,但这只是一个例子。)

3 个答案:

答案 0 :(得分:1)

订购验证:否。

在这种情况下,您只需删除必需属性,因为“”或“”将无法通过电子邮件地址验证。

是的,AFAIK创建一个结合了它们的自定义验证属性可能是你最好的选择。

答案 1 :(得分:1)

这里的问题是属性的排序完全是任意的,并在编译时决定。实际上,您可以根据您使用的验证运行器的类型强制执行简单的排序。如果您正在使用类似xVal和验证运行程序之类的内容,例如here,您可以添加这样的orderby子句以强制特定类型的属性排序到顶部:

orderby attribute.GetType() == typeof(T) ? 0 : 1

只需创建一个强类型验证运行器方法,其中T派生自ValidationAttribute类。

答案 2 :(得分:1)

在这种特定情况下,我可能采用与ASP.NET WebForms验证器相同的方法 - 如果值为EmailAttribute或为空,则只需要true验证器返回null

想一想:

  • 如果需要电子邮件地址,那么还会有一个[Required]验证器,无论如何空/空电子邮件地址都会产生验证错误;

  • 如果电子邮件地址是可选的,则应将空/空值视为有效。

当您可以设计单个验证器以便一起玩时,无需解决拦截验证器的复杂问题!