FluentValidation 带着一些内置的验证器, 每个验证器都包含着一些特殊的占位符,当验证器创建消息的时候把它会把这些占位符会替换成合适的值。 (在使用VisualStudio的情况。这些验证器在我们指入点的时候都会显示出来。)
确保指定属性不是Null的。
例:
RuleFor(customer => customer.Surname).NotNull();
示例错误:'Surname' 不能为Null。
占位符:
确保指定属性不为空, 字符串string是不能empty 和 whitespace (值类型不能是默认值, 例如 int 不能为0)
列如:
RuleFor(customer => customer.Surname).NotEmpty();
示例错误: 'Surname' 不能为空。
占位符:
确保指定属性的值不等于特定值(或不等于另一个属性的值)
列如:
//不等于一个特定的值
RuleFor(customer => customer.Surname).NotEqual("Foo");
//不等于其它属性
RuleFor(customer => customer.Surname).NotEqual(customer => customer.Forename);
示例错误: 'Surname' 不能和 'Foo' 相等。
占位符:
可选, 指定比较器
RuleFor(customer => customer.Surname).NotEqual("Foo", StringComparer.OrdinalIgnoreCase);
确保指定属性的值等于特定值(或等于另一个属性的值)
列如:
//等于特定的值
RuleFor(customer => customer.Surname).Equal("Foo");
//等于其它属性
RuleFor(customer => customer.Password).Equal(customer => customer.PasswordConfirmation);
示例错误: 'Surname' 应该和 'Foo' 相等。
占位符:
可选, 指定比较器
RuleFor(customer => customer.Surname).Equal("Foo", StringComparer.OrdinalIgnoreCase);
确保特定字符串属性的长度在指定范围内。 但是,它不能确保字符串不为null。
列如:
RuleFor(customer => customer.Surname).Length(1, 250); //在1到250个字符之间 (含)
示例错误: 'Surname' 的长度必须在 1 到 250 字符,您输入了 0 字符。
注意: 只适用于字符串
占位符:
确保特定字符串属性的长度不超过指定的值
列如:
RuleFor(customer => customer.Surname).MaximumLength(5); //必须是5以内(含)
示例错误: 'Surname' 必须小于或等于5个字符。您输入了12个字符。
注意: 只适用于字符串
占位符:
确保特定字符串属性的长度超过指定的值
列如:
RuleFor(customer => customer.Surname).MinimumLength(10); //必须大于等于10个字符
示例错误: 'Surname' 必须大于或等于10个字符。您输入了3个字符。
注意: 只适用于字符串
占位符:
确保指定属性的值小于特定值(或小于另一个属性的值) 列如:
//小于一个特定的值
RuleFor(customer => customer.Age).LessThan(5);
//小于另一个属性
RuleFor(customer => customer.Age).LessThan(customer => customer.MaxAge);
示例错误: 'Age' 必须小于 '5'。
注意: 只适用于有实现了接口 IComparable
占位符:
确保指定属性的值小于或等特定值(或 小于或等于另一个属性的值)
列如:
//小于或等于一个特定的值
RuleFor(person => person.Age).LessThanOrEqualTo(5);
//小于或等于另一个属性
RuleFor(customer => customer.Age).LessThanOrEqualTo(customer => customer.MaxAge);
示例错误: 'Age' 必须小于或等于 '5'。
注意: 只适用于有实现了接口 IComparable
占位符:
确保指定属性的值大于特定值(或大于另一个属性的值) 列如:
//大于一个特定的值
RuleFor(customer => customer.Age).GreaterThan(5);
//大于另一个属性
RuleFor(customer => customer.Age).GreaterThan(customer => customer.MaxAge);
示例错误: 'Age' 必须大于 '5'。
注意: 只适用于有实现了接口 IComparable
占位符:
确保指定属性的值大于或等特定值(或 大于或等于另一个属性的值)
列如:
//大于或等于一个特定的值
RuleFor(person => person.Age).GreaterThanOrEqualTo(5);
//大于或等于另一个属性
RuleFor(customer => customer.Age).GreaterThanOrEqualTo(customer => customer.MaxAge);
示例错误: 'Age' 必须大于或等于 '5'。
注意: 只适用于有实现了接口 IComparable
占位符:
(也称为必须 Must)
将指定属性的值传递到 自定义验证逻辑的委托中
列如:
RuleFor(customer => customer.Surname).Must(surname => surname == "Foo");
示例错误: 'Surname' 不符合指定的条件。
同常在使用这个的验证器的时候我们会自己定义错误消息,不然的话默认的错误消息就不太友好了
.WithMessage("surname 应该等于Foo");
占位符:
注意,这边有一个额外的重载方法,可以用来获取当前的实例对象。使用这个我们可以方便跟另一个属性进行对比。
RuleFor(customer => customer.Surname).Must((customer, surname) => surname != customer.Forename)
注意上面只是Must的示例,最佳实践应该是用NotEqual
,
确保指定属性的值与给定的正则表达式匹配. 列如:
RuleFor(customer => customer.Surname).Matches("some regex here");
示例错误:'Surname' 的格式不正确。 通常我们也需要用WithMessage来自定义验证消息
占位符:
确保指定属性的值是有效的电子邮件地址格式。 列如:
RuleFor(customer => customer.Email).EmailAddress();
示例错误: 'Email' 不是有效的电子邮件地址。
占位符:
Issue里的评论
“The check is intentionally naive because doing something infallible is very hard. The email really should be validated in some other way, such as through an email confirmation flow where an email is actually sent. The validation attribute is designed only to catch egregiously wrong values such as for a U.I.”
或者,您可以使用旧的电子邮件验证行为,该行为使用与ASP.NET的.NET 4.x版本一致的正则表达式。 您可以通过调用在FluentValidation中使用此行为。 请注意,不建议使用此方法,因为不建议使用基于正则表达式的电子邮件验证。
RuleFor(x => x.Email).EmailAddress(EmailValidationMode.Net4xRegex)
检查字符串属性是否是有效的信用卡号。
列如:
RuleFor(x => x.CreditCard).CreditCard(); // creditCard为空或者null是可以通过验证的
示例错误: 'Credit Card' 不是有效的信用卡号。
占位符:
检查一个数值是否是有效的枚举值. 这用于防止将非法的数值强制转换为枚举类型。 列如: 下面的场景是有可能的
public enum ErrorLevel
{
Error = 1,
Warning = 2,
Notice = 3
}
public class Model
{
public ErrorLevel ErrorLevel { get; set; }
}
var model = new Model();
model.ErrorLevel = (ErrorLevel)4;
// 编译的时候是不会出错, 但从技术上讲,此值4不适用于此枚举。 枚举验证器可以防止这种情况的发生。
RuleFor(x => x.ErrorLevel).IsInEnum();
示例错误: 'Error Level' 的值范围不包含 '4'。
占位符:
检查字符串是否为有效的枚举名称。
// 大小写敏感的检查 ErrorLevelName为空或者Null是可能过过验证的。
RuleFor(x => x.ErrorLevelName).IsEnumName(typeof(ErrorLevel));
// 大小写不敏感的检查
RuleFor(x => x.ErrorLevelName).IsEnumName(typeof(ErrorLevel), caseSensitive: false);
示例错误: 'Error Level Name' 的值范围不包含 'abc'。
占位符:
与NotEmpty验证器相反。 检查属性值是否为null或该类型的默认值。
RuleFor(x => x.Surname).Empty();
示例错误: 'Error Level Name' 必须为空。
占位符:
与NotNull验证器相反。 检查属性值是否为null。
RuleFor(x => x.Surname).Empty();
示例错误: 'Error Level Name' 必须为Null。
占位符:
检查属性值是否在两个指定数字之间的范围内(不包含)。
RuleFor(x => x.Age).ExclusiveBetween(5, 90);
示例错误: 'Age' 必须在 5 (不包含)和 90 (不包含)之间, 您输入了 3。
占位符:
检查属性值是否在两个指定数字之间的范围内(包含)。
RuleFor(x => x.Age).InclusiveBetween(5, 90);
示例错误: 'Age' 必须在 5 (包含)和 90 (包含)之间, 您输入了 3。
占位符:
检查decimal值是否具有指定的小数位数和精度。
RuleFor(x => x.Amount).ScalePrecision(2, 4);
// Amount = 1.222222m
示例错误::'Amount' 总位数不能超过 4 位,其中小数部分 2 位。您共计输入了 1 位数字,其中小数部分6 位。
占位符:
// Amount = 1.221000m,
RuleFor(x => x.Amount).ScalePrecision(2, 4, true);
错误消息: 'Amount' 总位数不能超过 4 位,其中小数部分 2 位。您共计输入了 1 位数字,其中小数部分3 位。 可以看到 0已经被忽略了