簡體   English   中英

用於Web API PUT方法的MediaFormatter或ModelBinder

[英]MediaFormatter or ModelBinder for web api PUT method

我在Web api中有一個PUT方法,該方法接受JSON數據和路由數據,如下所示。

[Route("api/v1/Orders/{orderId}/active")]
    public HttpResponseMessage Put(Guid? orderId,List<ActiveRequest> activeRequests)
    {


    }
public class ActiveRequest
{
    public int Id { get; set; }
    public bool IsActive { get; set; } 
}

現在可以將方法簽名簡化為:

[Route("api/v1/Orders/{orderId}/active")]
    public HttpResponseMessage Put(ActiveRequestModel model)
    {


    }
public class ActiveRequestModel
{
    public Guid OrderId { get; set; }
    public List<ActiveRequest> ActiveRequests {get; set;} 
}

我嘗試通過實現System.Web.Http.ModelBinding.IModelBinder接口來編寫自定義ModelBinder,但找不到找到讀取Request對象內部的JSON數據的方法。 我懷疑是否有一種方法可以將我的模型與來自三個不同位置的數據綁定在一起,即來自路由數據,json和form的數據

您無法按照說明簡化參數。

與MVC模型綁定不同,由於Web API格式化程序的工作方式,在We​​b API中,您只能有一個從有效負載中反序列化的參數,而多個簡單類型參數則來自路由參數或url查詢字符串。 原因是來自有效負載的參數的創建是在有效負載的單遍反序列化中完成的。

因此,對於您的示例,您需要原始版本中的兩個參數,即:

public HttpResponseMessage Put(Guid? orderId, List<ActiveRequest> activeRequests)

如果要使用ActiveRequestModel ,則需要包括一個具有完全相同結構的有效負載,因此您應在該有效負載中包含orderId ,因為它不會從url中恢復(即使名稱匹配)。

請閱讀本文,該文章解釋了Web API中參數綁定的工作方式:

如果仔細閱讀,您會發現您可以創建和注冊自己的模型綁定器,使其與MVC控制器的工作方式相同,但是我認為這樣做不值得(因此,我僅在最后一段中包括它) ,這不是標准的工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM