我可以忽略 ASP.Net 核心 API 模型中的 属性 吗?
Can I ignore a property in an ASP.Net Core API model?
我的 API 上有一个模型如下:
namespace Models
{
public class Car
{
public guid Id { get; set; }
public string Name { get; set; }
}
}
此模型用于我的 API 中的 POST 端点,允许用户将汽车添加到系统。
我遇到的问题是 Id
是由数据库决定的。发布此有效负载时,我希望用户不指定 ID。
当我开始我的项目并查看自动生成的 swagger 文档时,Id
字段在那里并自动填充。
如何抑制这个 Id
字段,以便用户只会在 JSON 有效负载中发送汽车 Name
字段?
当用户执行 GET /car/12345
时,我希望 JSON 负载中返回 Id
字段,所以我不想完全忽略它。
如果您使用的是 Swashbuckle,您可以安装 Swashbuckle.AspNetCore.Annotations NuGet 包,然后使用 SwaggerSchema
属性,如下所示:
namespace Models
{
public class Car
{
[SwaggerSchema(ReadOnly = true)]
public guid Id { get; set; }
public string Name { get; set; }
}
}
这将在生成的 OpenAPI 文档中用 ReadOnly 属性标记 属性。
如果你想在接受输入时完全排除属性,你可以创建一个单独的输入模型。输入模型的价值在于它反映了该操作所需的特定数据子集,不一定反映数据库或以后检索所需的内容,并允许您分离输入验证等行为,以便您不要将该责任推给您的主要 DTO。现在,收到的输入可能以某种方式注入 ID 或以您不希望的方式错误处理 属性 的风险为零。
public class CarInputModel
{
[Required]
public string Name { get; set; }
public Car ToCar() => new() { Id = Guid.Empty, Name = Name };
}
public class Car
{
public Guid Id { get; set; }
public string Name { get; set; }
}
一旦您的 API 收到该输入模型,您就可以将该输入模型转换为 Car
,因为您知道您可以完全控制用户提供的输入。
我的 API 上有一个模型如下:
namespace Models
{
public class Car
{
public guid Id { get; set; }
public string Name { get; set; }
}
}
此模型用于我的 API 中的 POST 端点,允许用户将汽车添加到系统。
我遇到的问题是 Id
是由数据库决定的。发布此有效负载时,我希望用户不指定 ID。
当我开始我的项目并查看自动生成的 swagger 文档时,Id
字段在那里并自动填充。
如何抑制这个 Id
字段,以便用户只会在 JSON 有效负载中发送汽车 Name
字段?
当用户执行 GET /car/12345
时,我希望 JSON 负载中返回 Id
字段,所以我不想完全忽略它。
如果您使用的是 Swashbuckle,您可以安装 Swashbuckle.AspNetCore.Annotations NuGet 包,然后使用 SwaggerSchema
属性,如下所示:
namespace Models
{
public class Car
{
[SwaggerSchema(ReadOnly = true)]
public guid Id { get; set; }
public string Name { get; set; }
}
}
这将在生成的 OpenAPI 文档中用 ReadOnly 属性标记 属性。
如果你想在接受输入时完全排除属性,你可以创建一个单独的输入模型。输入模型的价值在于它反映了该操作所需的特定数据子集,不一定反映数据库或以后检索所需的内容,并允许您分离输入验证等行为,以便您不要将该责任推给您的主要 DTO。现在,收到的输入可能以某种方式注入 ID 或以您不希望的方式错误处理 属性 的风险为零。
public class CarInputModel
{
[Required]
public string Name { get; set; }
public Car ToCar() => new() { Id = Guid.Empty, Name = Name };
}
public class Car
{
public Guid Id { get; set; }
public string Name { get; set; }
}
一旦您的 API 收到该输入模型,您就可以将该输入模型转换为 Car
,因为您知道您可以完全控制用户提供的输入。