我正在创建一个POST Rest API(ASP.NET Web API)来执行写操作,因此必须在将数据插入Database之前验证数据。我使用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");
在对象集合上使用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"));
}
}
答案 0 :(得分:0)
您可以使用 RulesetValidatorSelector
执行多个RuleSetvar validation = new ListingValidator()
.Validate(listing, new RulesetValidatorSelector("common", "A", "B", "C"));
在这种情况下,您不需要为 ListingStatusValidator 指定RuleSet, ListingValidator 中的RuleSets将被传递给嵌套的验证器。