【问题标题】:Is there any way to stop DataAnnotation validation after the first failure?第一次失败后有什么方法可以停止 DataAnnotation 验证?
【发布时间】:2010-02-20 07:47:13
【问题描述】:

在我的 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 注释合并到自定义电子邮件注释中,但这只是一个示例)。

【问题讨论】:

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


    【解决方案1】:

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

    想一想:

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

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

    无需解决拦截验证器的复杂问题,您只需设计单个验证器以使其配合得很好!

    【讨论】:

    • 感谢您的回答。我想你是对的,我可以更改验证,以便它们正常工作,如果不可能,只需将它们合并为一个。
    【解决方案2】:

    订单验证:否。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多