繁体   English   中英

ASP.NET Web API如何基于put / get / post / delete从DTO对象中排除属性

[英]ASP.NET web api how to exclude property from DTO object based on put/get/post/delete

我正在使用ASP.NET Web API(第一次!)。 对于每个数据库对象,我都创建了一个DTO对象以展平这些对象。 我使用自动映射器来映射这些对象。 我只想对所有请求类型(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排除属性?

如果我执行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框架甚至专门设计用于将一种模型与一种请求匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM