结合NotEmpty()和When()的自定义流利验证

时间:2018-11-02 11:20:34

标签: validation asp.net-web-api fluentvalidation

模型-Product.cs

public string id { get; set; }
public string name { get; set; }
public string type { get; set; }
public string status { get; set; }

流利验证规则

RuleFor(x => x.id).NotEmpty().When(x => x.status == "FIN").WithMessage("This field is required").IsValidInt();
RuleFor(x => x.name).NotEmpty().When(x => x.status == "FIN").WithMessage("This field is required");
RuleFor(x => x.type).NotEmpty().When(x => x.status == "FIN").When(x=>x.status == "FIN").WithMessage("This field is required").DDLIdExist();

这里 IsValidInt() DDLIdExist() 是我的自定义验证规则。此外,它仅在状态设置为 FIN 时检查字段是否为非空。

现在您可以看到下面的部分很重复。

NotEmpty().When(x => x.status == "FIN").WithMessage("This field is required")

所以我的问题是,我可以将这两个规则组合到一个单独的自定义验证函数中,该函数以x.status作为参数并显示“此字段是必需的”。如果是,怎么办?

2 个答案:

答案 0 :(得分:0)

您应该将AbstractValidator类子类化,并定义自定义规则以拥有更多控制权。

public class ProductValidator : AbstractValidator<Product> {
  public ProductValidator() {
   RuleFor(x => x.Status).Custom((text, context) => {
     if(text == "FIN" || string.IsNullOrEmpty(text)) {
       context.AddFailure("This field is required");
     }
   });
  }
}

请注意,这只是一个想法,而不是您执行此操作的实际方法。

请参阅文档here

答案 1 :(得分:0)

您可以将这些调用包装在扩展方法中:

private static X RequiredWhenFIN(this Y y) => y.NotEmpty().When(x => x.status == "FIN").WithMessage("This field is required");

YRuleFor()返回的类型,而XWithMessage()返回的类型。

然后像这样重构您的测试:

RuleFor(x => x.id).RequiredWhenFIN().IsValidInt();
RuleFor(x => x.name).RequiredWhenFIN();
RuleFor(x => x.type).RequiredWhenFIN().DDLIdExist();
相关问题