【发布时间】: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