【发布时间】:2014-02-21 20:29:34
【问题描述】:
最初在为字符串编写验证逻辑时,我决定对所需的任何字符串使用 NotEmpty。当使用 .NotEmpty().Length(min, max) 时,这将导致返回两个错误,而不是在传入空字符串时返回一个错误。
如何防止冗余错误?
【问题讨论】:
标签: c# .net string validation fluentvalidation
最初在为字符串编写验证逻辑时,我决定对所需的任何字符串使用 NotEmpty。当使用 .NotEmpty().Length(min, max) 时,这将导致返回两个错误,而不是在传入空字符串时返回一个错误。
如何防止冗余错误?
【问题讨论】:
标签: c# .net string validation fluentvalidation
.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);
【讨论】:
null,RuleFor(o => o.PropertyName).Length(min, max) 不会返回错误,这对我来说似乎很奇怪。这是为什么?这种行为背后有什么逻辑吗?因为我什么都看不到......我认为验证字符串的机制应该接收NullReferenceException 或类似的东西,因为它测试不存在的对象的长度。那为什么不抛出任何错误呢?
另一种防止发生额外错误的方法是set the cascade mode。
RuleFor(x => x.PropName)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotEmpty()
.Length(min, max);
【讨论】: