Swagger无法识别嵌套对象的Fluent验证

时间:2016-08-04 13:29:03

标签: c# swagger fluentvalidation

我正在为我的模型使用Fluent验证,我尝试使用Swagger映射字段和验证。

我有以下型号:

public abstract class PersonModel
{
    protected PersonModel()
    {
        DetailModel = new DetailModel();
    }

    public DetailModel Details { get; set; }
}

public class CustomerModel : PersonModel
{
    public DateTime DateJoined { get; set; }
}

public class DetailModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我使用Fluent验证设置了以下验证:

public class CustomerModelValidator : AbstractValidator<CustomerModel>
{
    public CustomerModelValidator()
    {
        RuleFor(x => x.DetailModel.FirstName)
            .NotEmpty().WithMessage("FirstName is required");

        RuleFor(x => x.DateJoined)
            .NotEmpty().WithMessage("DateJoined is required");
    }
}

为了让Swagger了解Fluent验证,我使用本网站作为参考: http://blog.yeticode.co.uk/2015/10/add-fluentvalidation-rules-to-swagger.html

为了让Swagger了解新的验证,下面这行就是神奇的:

schema.required.Add("DateJoined");

但是,Swagger不理解FirstName之类的子验证。如果我在这种情况下在字段[Required]之上使用数据注释,则Swagger会正确识别它。

此博客提供的解决方案的问题是变量Schema不包含DetailModel字段的导航。它只包含DetailModel的定义。

但由于架构中未列出FirstName,因此我无法将其添加到必填字段。

有人设法做到了吗?

2 个答案:

答案 0 :(得分:0)

由于Swagger不理解“嵌套”模型 - 让你的模型变平:

public class CustomerModel : PersonModel
{
    public DateTime DateJoined { get; set; }
}

public abstract class PersonModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

<强> P.S。

如果this code是使 FluentValidation 在Swagger中工作的唯一因素 - 我强烈建议您使用 DataAnnotations ,因为它具有更多功能验证实施。

答案 1 :(得分:0)

1.为每个班级创建验证器:

public class CustomerModelValidator : AbstractValidator<CustomerModel>
{
    public CustomerModelValidator()
    {
        RuleFor(x => x.DateJoined)
            .NotEmpty().WithMessage("DateJoined is required");
    }
}

public class DetailModelValidator : AbstractValidator<DetailModel>
{
    public DetailModelValidator()
    {
        RuleFor(x => x.FirstName)
            .NotEmpty().WithMessage("FirstName is required");
    }
}
  1. 用于集成fluentValidation和swagger use package https://www.nuget.org/packages/MicroElements.Swashbuckle.FluentValidation/

  2. 结果: screenshot