Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET web api如何基于put/get/post/delete从DTO对象中排除属性_C#_Asp.net_Attributes_Asp.net Web Api2_Dto - Fatal编程技术网

C# ASP.NET web api如何基于put/get/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

我正在开发一个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
{
    [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服务的标准设置。