模型-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
作为参数并显示“此字段是必需的”。如果是,怎么办?
答案 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");
Y
是RuleFor()
返回的类型,而X
是WithMessage()
返回的类型。
然后像这样重构您的测试:
RuleFor(x => x.id).RequiredWhenFIN().IsValidInt();
RuleFor(x => x.name).RequiredWhenFIN();
RuleFor(x => x.type).RequiredWhenFIN().DDLIdExist();