【问题标题】:FluentValidation string NotNull versus NotEmptyFluentValidation 字符串 NotNull 与 NotEmpty
【发布时间】:2014-02-21 20:29:34
【问题描述】:

最初在为字符串编写验证逻辑时,我决定对所需的任何字符串使用 NotEmpty。当使用 .NotEmpty().Length(min, max) 时,这将导致返回两个错误,而不是在传入空字符串时返回一个错误。

如何防止冗余错误?

【问题讨论】:

    标签: c# .net string validation fluentvalidation


    【解决方案1】:

    .Length(min, max) 如果字符串为空则不会返回错误,但是当字符串为空且min大于0时会返回错误。有两种方法可以实现所需字符串的最小值长度大于 0。

    在第一个错误上停止的典型方法是使用 Cascade 方法:

        RuleFor(o => o.PropertyName)
            .Cascade(CascadeMode.StopOnFirstFailure)
            .NotEmpty() // Will return an error if null or empty
            .Length(2, 10) // Will only return an error if length == 1 or > than 10
    

    但是对于字符串,以下内容更容易阅读:

        RuleFor(o => o.PropertyName)
            .NotNull()
            .Length(2, 10) // Will not return an error on null
    

    使用 NotNull、NotEmpty 和 Length 的字符串验证场景:

    可选的最大长度:

        RuleFor(o => o.PropertyName).Length(0, max);


    可选的最小和最大长度:

        RuleFor(o => o.PropertyName).Length(min, max);


    必需,但长度可以为零:

        RuleFor(o => o.PropertyName).NotNull()


    必需且长度必须非零:

        RuleFor(o => o.PropertyName).NotEmpty();


    必需且有一个最大长度:

        RuleFor(o => o.PropertyName).NotNull().Length(0, max);


    必填,并且有最小和最大长度:

        RuleFor(o => o.PropertyName).NotNull().Length(min, max);

    【讨论】:

    • 如果字符串为nullRuleFor(o => o.PropertyName).Length(min, max) 不会返回错误,这对我来说似乎很奇怪。这是为什么?这种行为背后有什么逻辑吗?因为我什么都看不到......我认为验证字符串的机制应该接收NullReferenceException 或类似的东西,因为它测试不存在的对象的长度。那为什么不抛出任何错误呢?
    • 嗨,正如作者所说:每条规则都在做一项工作。 NotNull 用于检查 null 和 Length() 用于检查字符串的长度。希望有帮助。 Szczesc Boze。
    • @Salivan 该用例可以直接绑定到 HTTP Patch 请求,其中未包含在属性中的属性不会更新。对于 String 和 Nullable 来说,验证包含的属性是否有效非常容易,但不包含的属性 (JSON) 会被忽略(它们将被映射为 null)。使用不为空的实体框架非常容易更新这些属性。
    【解决方案2】:

    另一种防止发生额外错误的方法是set the cascade mode

    RuleFor(x => x.PropName)
        .Cascade(CascadeMode.StopOnFirstFailure)
        .NotEmpty()
        .Length(min, max);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2013-06-12
      • 1970-01-01
      相关资源
      最近更新 更多