【问题标题】:ASP.NET web api how to exclude property from DTO object based on put/get/post/deleteASP.NET web api如何基于put/get/post/delete从DTO对象中排除属性
【发布时间】:2015-11-29 03:09:51
【问题描述】:

我正在开发一个 ASP.NET web api(第一次!)。对于每个数据库对象,我都创建了一个 DTO 对象来展平对象。我使用 automapper 来映射这些对象。我只想对所有请求类型(get/put/post/delete)使用一个 DTO 对象。

简化示例:

public class ProductDB
{
    public int ProductId { get; set; }
    public string Name { get; set; }
}

public class ProductDTO
{
    [JsonIgnore] -- only in case of a put/post/delete request
    [XmlIgnore] -- only in case of a put/post/delete request
    public int ProductId { get; set; }
    public string Name { get; set; }
}

如果我执行 HttpGet 来获取产品列表,我想在响应中包含 ProductId。响应类型将是 IEnumerable ProductDTO,包括 ProductIds。

如果我执行 HttpPut,请求将是:https://base-url/products/id 以 ProductDTO 作为正文。但是,在这种情况下,我不希望 ProductId 包含在 ProductDTO 中。

我知道如何通过使用 [JsonIgnore] 和 [XmlIgnore] 属性来装饰属性来排除属性。但是,这将始终排除它们。我想根据请求是 HttpGet/HttpPost/HttpPut/HttpDelete 有条件地排除它们。

这可能吗?还是有其他方法可以根据请求类型从 DTO 中排除属性?

【问题讨论】:

  • 为什么要给自己这个问题,为什么不简单地将 put/post URL 设为 base-url/products 并且控制器从对象而不是 URI 中检索 id。然后对于删除,您使用base-url/products/id,但您根本不需要发送对象,只需一个空的删除请求,您需要删除的唯一信息是 ID,它位于 URI 中。这是 RESTful 服务的标准设置。

标签: c# asp.net attributes asp.net-web-api2 dto


【解决方案1】:

如果我执行 HttpPut,请求将是:https://base-url/products/id 以 ProductDTO 作为正文。但是,在这种情况下,我不希望 ProductId 包含在 ProductDTO 中。

技术上不需要,因为我们只是在谈论请求而不是响应。取决于客户端发送的内容。如果客户端发送这个 JSON:

{
    "Name" : "Some Value"
}

那么就模型绑定器而言,这是有效的。它将创建一个带有 Name 属性集的 ProductDTO 实例。然后,在服务器端代码中,您可以根据路由中的id 设置ProductId 属性,执行映射,然后您就拥有了域对象。

客户端不需要知道他们可以在 JSON 中设置 ProductId 属性。 (如果他们无论如何设置了一个,它只会被代码中的路由值默默地覆盖并且基本上被忽略。当然,如果他们在 DTO 上没有这样的属性时设置了一个,那么它也只是简单地被忽略。)

对于传出 DTO,您需要微调序列化程序包含的内容和不包含的内容。但是对于传入 DTO,您有更多的余地,因为您实际上并没有以任何方式向消费系统宣传 DTO 的形状。

我唯一一次看到这是一个问题是在使用工具生成 API 文档时。例如,Swashbuckle 之类的东西将在 API 文档中包含该属性。这并不理想。在这种情况下,我发现最短的路径是为单独的操作创建单独的 DTO。这并不少见,一些 MVC 框架甚至专门设计为将一个模型与一个请求匹配。

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 2015-01-25
    • 1970-01-01
    • 2019-09-14
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2013-02-23
    相关资源
    最近更新 更多