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。
我仍然愿意进一步讨论。
谢谢。
我正在用 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。
我仍然愿意进一步讨论。
谢谢。