为验证某个特定的模型,我们需要创建一个继承于 AbstractValidator<T>
的类,这个T就是我们需要校验的类(class).
比如,我们有如下这样的一个Customer 类
public class Customer
{
public int Id { get; set; }
public string Surname { get; set; }
public string Forename { get; set; }
public decimal Discount { get; set; }
public string Address { get; set; }
}
你如果想为上面的类定义一些验证的规则的话,你可以创建出如下的一个类
using FluentValidation;
public class CustomerValidator : AbstractValidator<Customer>
{
}
验证规则必须被定义在构造函数里面
如果你要为某个属性定义某个验证规则的话。你可以调用RuleFor方法,并传入一个 lambda 表达式 例如,如果我们想要验证 Surname不能为Null的话。 我们可以创建出如下的代码
using FluentValidation;
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
RuleFor(customer => customer.Surname).NotNull();
}
}
现在我们来看一下,如保使用刚才哪个类来进行验证。(在Asp.net core 当中我们会有更方便的方式,不需要这样显示来调用。) 如果对这个验证类写单元测试的话,我们也可以用这种方式。 实例化一个CustomerValidator 调用方法Validate来进行验证
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult result = validator.Validate(customer);
这个方法会返回一个 ValidationResult的对象, 这个对象包含两个属性
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
if(! results.IsValid)
{
foreach(var failure in results.Errors)
{
Console.WriteLine("Property " + failure.PropertyName + " failed validation. Error was: " + failure.ErrorMessage);
}
}
我们也可以把所有的错识信息拼接成一个,默认情况下这个拼接符是换行 如果我们想自己处理的话,我们可以通过传入参数的方式来控制它
ValidationResult results = validator.Validate(customer);
string allMessages = results.ToString("~"); // 错识消息与 "~"拼在一起
注意:如果没有任何错误的话。这个会返回一个空字符串。
我们可以把多个验证规则连在一起来验证某个属性
using FluentValidation;
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
RuleFor(customer => customer.Surname).NotNull().NotEqual("foo");
}
}
除了返回 ValidationResult,我们还可以在验证没通过的时候直接让 FluentValidation 抛出异常
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
validator.ValidateAndThrow(customer);
这个方法会抛出一个异常 ValidationException
错误消息都放在了Errors里面.
注意 ValidationAndThrow 是一个扩展方法,我们必须 添加 FluentValidation
namespace
这个方法等价于
validator.Validate(customer, options => options.ThrowOnFailures());
如果在使用RuleSets的时候还打算抛出异常的时候,我们可以用下面的方法
validator.Validate(customer, options => {
options.ThrowOnFailures();
options.IncludeRuleSets("MyRuleSets");
options.IncludeProperties(x => x.Name);
});