【问题标题】:Swagger does not recognise Fluent Validation of nested objectsSwagger 无法识别嵌套对象的 Fluent Validation
【发布时间】:2016-08-04 13:29:03
【问题描述】:

我正在为我的模型使用 Fluent Validation,并尝试使用 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 Validation 的验证集:

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 Validation,我参考了这个网站: 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 未在架构中列出,我无法将其添加到必填字段中。

有人做到了吗?

【问题讨论】:

    标签: c# swagger fluentvalidation


    【解决方案1】:

    由于 Swagger 不理解“嵌套”模型 - 让您的模型扁平化:

    public class CustomerModel : PersonModel
    {
        public DateTime DateJoined { get; set; }
    }
    
    public abstract class PersonModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    附言

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

    【讨论】:

    • 我只提到了schema.required.Add("DateJoined");这一行,以方便阅读博客文章。验证已经到位,这一行只会让 Swagger 认识到 DateJoined 是必需的。我遇到的问题是嵌套对象。
    • @GustavoMichel 我误解了你。您是否尝试在代码中手动添加键“Details.FirstName”、“Details.LastName”?之后验证是否有效?
    • 是的,我试过了,但没用,因为Details.FirstNameDetails.LastName 不在schema.properties 字段列表中。只有Details 在该列表中。验证适用于 FluentValidation。我唯一的问题是 Swagger 将其识别为必填字段。
    • 您对这个问题还有什么建议吗?
    【解决方案2】:

    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 使用包https://www.nuget.org/packages/MicroElements.Swashbuckle.FluentValidation/

    2. 结果: screenshot

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多