簡體   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