FluentValidation 使用规则集在集合上设置验证器
FluentValidation set validator on collection with Ruleset
我正在创建一个 POST Rest API(ASP.NET Web API) 来执行写入操作,因此必须在将数据插入 Database.I 对使用 FluentValidation 验证数据还很陌生。
假设下面是我需要验证的 类。
public class Listing
{
public Type Type { get; set; }
public Source Source { get; set; }
public List<ListingDetails> ListingDetails { get;set; }
}
public class ListingDetails
{
public int Id{ get; set; }
public ListingStatus Status { get; set; }
}
public enum ListingStatus
{
Active = 1,
Converted = 2,
LostToCompetitor = 3
}
下面的代码负责根据提供的规则集验证状态。
public class ListingStatusValidator : AbstractValidator<ListingDetails>
{
public ListingStatusValidator()
{
RuleSet("A", () =>
{
RuleFor(x=>x.InquiryId).GreaterThan(0);
});
RuleSet("B", () =>
{
RuleFor(x => x.Status).IsInEnum().NotEqual(ListingStatus.Active);
});
RuleSet("C", () =>
{
RuleFor(x => x.Status).IsInEnum();
});
}
}
下面是用于验证列表的代码。
public class ListingValidator : AbstractValidator<Listing>
{
public ListingValidator()
{
RuleSet("common", () =>
{
When(x => x.ListingDetails != null && x.ListingDetails.Count <= 1000, () =>
RuleForEach(x => x.ListingDetails).SetValidator(new ListingStatusValidator()));
});
}
}
现在要验证我们将调用验证器的验证方法,如下所示。
var validation = new ListingValidator().Validate(listing,ruleSet:"common");
在 objects.Please 的集合上使用 setvalidator 进行验证时是否可以通过规则集?请参阅下面的代码片段以了解我要实现的目标。
public class ListingValidator : AbstractValidator<Listing>
{
public ListingValidator()
{
When(x => x.ListingDetails != null && x.ListingDetails.Count <= 1000, () =>
RuleForEach(x => x.ListingDetails).SetValidator(new ListingStatusValidator(),ruleset:"A,B,C"));
}
}
您可以使用 RulesetValidatorSelector
执行多个规则集
var validation = new ListingValidator()
.Validate(listing, new RulesetValidatorSelector("common", "A", "B", "C"));
在这种情况下,您不需要为 ListingStatusValidator 指定规则集,来自 ListingValidator 的规则集将传递给嵌套验证器。
我正在创建一个 POST Rest API(ASP.NET Web API) 来执行写入操作,因此必须在将数据插入 Database.I 对使用 FluentValidation 验证数据还很陌生。 假设下面是我需要验证的 类。
public class Listing
{
public Type Type { get; set; }
public Source Source { get; set; }
public List<ListingDetails> ListingDetails { get;set; }
}
public class ListingDetails
{
public int Id{ get; set; }
public ListingStatus Status { get; set; }
}
public enum ListingStatus
{
Active = 1,
Converted = 2,
LostToCompetitor = 3
}
下面的代码负责根据提供的规则集验证状态。
public class ListingStatusValidator : AbstractValidator<ListingDetails>
{
public ListingStatusValidator()
{
RuleSet("A", () =>
{
RuleFor(x=>x.InquiryId).GreaterThan(0);
});
RuleSet("B", () =>
{
RuleFor(x => x.Status).IsInEnum().NotEqual(ListingStatus.Active);
});
RuleSet("C", () =>
{
RuleFor(x => x.Status).IsInEnum();
});
}
}
下面是用于验证列表的代码。
public class ListingValidator : AbstractValidator<Listing>
{
public ListingValidator()
{
RuleSet("common", () =>
{
When(x => x.ListingDetails != null && x.ListingDetails.Count <= 1000, () =>
RuleForEach(x => x.ListingDetails).SetValidator(new ListingStatusValidator()));
});
}
}
现在要验证我们将调用验证器的验证方法,如下所示。
var validation = new ListingValidator().Validate(listing,ruleSet:"common");
在 objects.Please 的集合上使用 setvalidator 进行验证时是否可以通过规则集?请参阅下面的代码片段以了解我要实现的目标。
public class ListingValidator : AbstractValidator<Listing>
{
public ListingValidator()
{
When(x => x.ListingDetails != null && x.ListingDetails.Count <= 1000, () =>
RuleForEach(x => x.ListingDetails).SetValidator(new ListingStatusValidator(),ruleset:"A,B,C"));
}
}
您可以使用 RulesetValidatorSelector
执行多个规则集var validation = new ListingValidator()
.Validate(listing, new RulesetValidatorSelector("common", "A", "B", "C"));
在这种情况下,您不需要为 ListingStatusValidator 指定规则集,来自 ListingValidator 的规则集将传递给嵌套验证器。