SwaggerSchema 不适用于我自己的对象

SwaggerSchema is not working for my own objects

我正在用 ASP.NET 创建 Web API。为了向用户公开我的数据库模型,我创建了数据模板对象,这样我就可以 show/hide 来自 swagger 模式的属性。

问题是,如果我想区分 POST 和 GET 方法,我认为这是不可扩展的。

假设我有一个博客模型,其中有一个标识符、一个名称和一个创建者。当我创建一个新博客时,我只想设置博客的名称。另一方面,我想在发送 GET 请求时读取其他属性。

数据库模型

public class Blog
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [ForeignKey("CreatorId")]
    public Users Creator { get; set; }
    public int CreatorId { get; set; }
}

数据模板对象

public class BlogDto
{
    public int Id { get; set; }

    public string Name { get; set; }

    public Users Creator { get; set; }
}

现在,如果我 运行 此代码,post 请求要求我设置所有创建者对象,以及博客 ID(应由 Entity Framework 设置)。

我发现我可以通过设置 [SwaggerSchema(ReadOnly = true)] 来隐藏标识符字段。不幸的是,此属性不适用于我的创作者 属性。

也就是说,如果我将 BlogDto 设置为:

public class BlogDto
{
    [SwaggerSchema(ReadOnly = true)]
    public int Id { get; set; }

    public string Name { get; set; }

    [SwaggerSchema(ReadOnly = true)]
    public Users Creator { get; set; }
}

POST 方法的 Swagger 助手将是:

我希望请求正文是:

{
  "name": "string"
}

(仅当属性 SwaggerSchema 位于我创建的对象上时才会触发此问题)。

我已经尝试使用 [JsonIgnore][ReadOnly(true)] 自定义 Json 序列化程序、更改 SchemaFilter。我发现的解决方法是创建一个仅具有 string Name { get; set; } 属性 的 BlogPostDto 和具有所有三个属性的 BlogGetDto,但我想知道是否可以仅使用一个 Dto 来做到这一点。

终于找到答案了

Swagger 存储库 (readOnly on nested objects) 中也报告了此问题,但我无法理解 Asp.Net 等效项。

但是我尝试将 [SwaggerSchema(ReadOnly = true)] 添加到 class 本身。我不知道为什么会这样,或者即使它会在其他地方产生问题。无论如何,这是我的方法,因为我在这里无法收到任何其他回复。

简而言之,我所做的是为用户模型添加一个新的数据模板对象:

[SwaggerSchema(ReadOnly = true)]
public class UserDto
{
    [SwaggerSchema(ReadOnly = true)]
    public int Id { get; set; }

    public string Username { get; set; }

    public string Email { get; set; }
}

请注意,我将 SwaggerSchema 属性放入 class。然后我可以删除 BlogDto Creator 属性:

的属性
public class BlogDto
{
    [SwaggerSchema(ReadOnly = true)]
    public int Id { get; set; }

    public string Name { get; set; }

    public UserDto Creator { get; set; }
}

我想我必须将属性添加到我为项目创建的每个 DTO。

我仍然愿意进一步讨论。

谢谢。