FluentValidation 复杂属性 complex properties

在复杂类型上面重用验证器。 例如,假如我们有两个类 Customer 和 Address:

public class Customer
{
  public string Name { get; set; }
  public Address Address { get; set; }
}

public class Address
{
  public string Line1 { get; set; }
  public string Line2 { get; set; }
  public string Town { get; set; }
  public string County { get; set; }
  public string Postcode { get; set; }
}

接下来我们定义一个 AddressValidator

public class AddressValidator : AbstractValidator<Address> 
{
  public AddressValidator() 
  {
    RuleFor(address => address.Postcode).NotNull();
    //etc
  }
}

我们可以在CustomerValidator里面重用AddressValidator

public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator() 
  {
    RuleFor(customer => customer.Name).NotNull();
    RuleFor(customer => customer.Address).SetValidator(new AddressValidator());
  }
}

当我们调用 CustomerValidator Validate 方法的时候。 CustomerValidator会被先调用,然后 AddressValidator. 这两个的验证的结果也会被自动合并到同一个ValidationResult里面。

如果这个子属性Address为Null的话,这个Address验证器不会被执行。

如果不想用 子验证器的话,我们还可以直接为子类的属性定义验证规则。如下

RuleFor(customer => customer.Address.Postcode).NotNull()

在这种情况,这个验证器并不会判断 address是不是为Null。我们需要自己添加一个条件。

RuleFor(customer => customer.Address.Postcode).NotNull().When(customer => customer.Address != null)
最近更新的
...