FluentValidation在集合

时间:2018-03-15 06:44:33

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

我正在创建一个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"));
    }
} 

1 个答案:

答案 0 :(得分:0)

您可以使用 RulesetValidatorSelector

执行多个RuleSet
var validation = new ListingValidator()
    .Validate(listing, new RulesetValidatorSelector("common", "A", "B", "C"));

在这种情况下,您不需要为 ListingStatusValidator 指定RuleSet, ListingValidator 中的RuleSets将被传递给嵌套的验证器。