C# ASP.NET web api如何基于put/get/post/delete从DTO对象中排除属性
我正在开发一个ASP.NETWebAPI(第一次!)。对于每个数据库对象,我都创建了一个DTO对象来展平对象。我使用automapper来映射这些对象。我只想对所有请求类型(get/put/post/delete)使用一个DTO对象 简化示例:C# ASP.NET web api如何基于put/get/post/delete从DTO对象中排除属性,c#,asp.net,attributes,asp.net-web-api2,dto,C#,Asp.net,Attributes,Asp.net Web Api2,Dto,我正在开发一个ASP.NETWebAPI(第一次!)。对于每个数据库对象,我都创建了一个DTO对象来展平对象。我使用automapper来映射这些对象。我只想对所有请求类型(get/put/post/delete)使用一个DTO对象 简化示例: public class ProductDB { public int ProductId { get; set; } public string Name { get; set; } } public class ProductDTO
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,包括ProductId
如果执行HttpPut,请求将是:ProductDTO作为主体。但是,在本例中,我不希望ProductDTO中包含ProductId
我知道如何通过同时使用[JsonIgnore]和[XmlIgnore]属性来排除属性。但是,这将始终排除它们。我希望根据请求HttpGet/HttpPost/HttpPut/HttpDelete有条件地排除它们
这可能吗?或者是否有其他方法根据请求类型从DTO中排除属性
如果执行HttpPut,请求将是:ProductDTO作为主体。但是,在本例中,我不希望ProductDTO中包含ProductId
从技术上讲,这并不需要,因为我们只是讨论请求,而不是响应。取决于客户端发送的内容。如果客户端发送此JSON:
{
"Name" : "Some Value"
}
那么就模型绑定器而言,这是有效的。它将使用该名称
属性集创建ProductDTO
的实例。然后,在服务器端代码中,您可以基于路由中的id
设置ProductId
属性,执行映射,您就拥有了域对象
客户机不需要知道他们可以在JSON中设置ProductId
属性。(如果他们还是设置了一个,它只会被代码中的路由值悄悄地覆盖,基本上被忽略。当然,如果他们在DTO上没有这样的属性时设置了一个,那么它也会被忽略。)
对于传出DTO,您希望微调序列化程序包含的内容和不包含的内容。但对于即将推出的DTO,您有更多的回旋余地,因为您实际上并没有以任何方式向消费系统宣传DTO的形状
我唯一一次看到这个问题是在使用工具生成API文档时。例如,类似这样的内容将在API文档中包含该属性。这并不理想。在这种情况下,我发现最短的路径是为单独的操作创建单独的DTO。这并不少见,一些MVC框架甚至专门设计为将一个模型与一个请求相匹配。为什么要给自己这个问题,为什么不让put/post URL为,控制器从对象而不是URI检索id。然后,对于delete,您使用但根本不需要发送对象,只需要一个空的delete请求,您需要删除的唯一信息是URI中的ID。这是restful服务的标准设置。