![](/img/trans.png)
[英]All methods act as a HTTP verb (Get, Put, Post And Delete) in ASP.NET WEB API controller
[英]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.