[英]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.