在我的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; }
现在,如果有人要提交表单,则两个错误都会显示在验证摘要中。是否有任何简单的方法来指定运行验证注释的顺序,以便在必需验证失败时,电子邮件验证不会运行?
如果无法做到这一点,通常如何处理?我应该为具有多个注释的任何字段创建自定义验证器吗?这是一种使用注释的正确方法,其中一个处理多种类型的验证吗?
(我也知道我可能会将必需的注释组合到自定义的电子邮件中,但这只是一个例子。)
答案 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]
验证器,无论如何空/空电子邮件地址都会产生验证错误;
如果电子邮件地址是可选的,则应将空/空值视为有效。
当您可以设计单个验证器以便一起玩时,无需解决拦截验证器的复杂问题!