3

在我的 ViewModels 中,我使用多个 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; }

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

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

(我也知道我可以将Required 注释组合到自定义电子邮件注释中,但这只是一个示例)。

4

3 回答 3

1

订购验证:否。

在这种情况下,您可以简单地删除Required 属性,因为“”或“”将无法通过电子邮件地址验证。

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

于 2010-02-20T20:28:03.633 回答
1

这里的问题是属性的顺序是完全任意的,并且在编译时决定。您实际上可以根据您使用的验证运行器的类型强制执行简单的排序。如果您使用的是 xVal 之类的东西和此处提到的验证运行器,您可以添加这样的 orderby 子句来强制将特定类型的属性排序到顶部:

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

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

于 2010-03-04T00:45:06.957 回答
1

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

想一想:

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

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

无需解决拦截验证器的复杂问题,您只需设计单个验证器即可一起玩得很好!

于 2010-03-04T01:09:10.543 回答