2013-10-10 116 views
4

this question擴展開來,我試圖將包含複雜對象集合的複雜對象傳遞給ASP.NET Web API控制器操作方法,但我正在查找請求中輸入對象的正確格式時遇到問題。繼續從克里斯托弗·約翰遜的問題的例子(和消除對simplicty某些字段),如果我改變他PhoneRequest對象包含電話號碼的集合...將包含複雜類型數組的複雜類型傳遞給Web API

public class PhoneRequest 
{ 
    public string[] PhoneNumbers { get; set; } 
    public string State { get; set; } 
} 

...我要麼傳遞參數作爲URL編碼的查詢字符串:

/api/phonenumber?id[0][State]=UT&id[0][PhoneNumbers][0]=555-1234567 

...或POST它作爲編碼的HTML表格(Content-Type: application/x-www-form-urlencoded)請求體:

[0][State]=UT&[0][PhoneNumbers][0]=555-1234567 

...然後一切都很好。但是,如果我改變PhoneNumbers從字符串到一個新的PhoneNumber類型的集合的集合......

public class PhoneRequest 
{ 
    public PhoneNumber[] PhoneNumbers { get; set; } 
    public string State { get; set; } 
} 
public class PhoneNumber 
{ 
    string AreaCode { get; set; } 
    string Number { get; set; } 
} 

...和我通過什麼,在我看來是合乎邏輯的方式對象,考慮到以前的結果......

id[0][State]=UT&id[0][PhoneNumbers][0][AreaCode]=555&id[0][PhoneNumbers][0][Number]=1234567 

...或再次作爲一個HTML表單提交的身體......

[0][State]=UT&[0][PhoneNumbers][0][AreaCode]=555&[0][PhoneNumbers][0][Number]=1234567 

...那麼它仍然使綁定它一個嘗試,並進入我的行動方法,但是該模型只包含狀態,並且電話號碼是這個奇怪的ComplexUriAndFormObject的事情。這是從我的調試器複製粘貼觀看:

phoneRequest {ComplexUriAndFormObject.Models.PhoneRequest[1]} 
    [0] {ComplexUriAndFormObject.Models.PhoneRequest} 
     PhoneNumbers {ComplexUriAndFormObject.Models.PhoneNumber[1]} 
     [0] {ComplexUriAndFormObject.Models.PhoneNumber} 
      AreaCode null 
      Number null 
     State "UT" 

是否有某種方法可以使用此格式正確指定此對象?還是我超越了模型綁定器中內置的ASP.NET Web API能夠執行的限制?

注意:請不要說「只是使用POST」或「只是使用JSON/XML /無論作爲您的內容類型」......如果我能做到這一點,我會的。

回答

8

到目前爲止,沒有內置的Web API模型綁定器,包括派生的FromUri和FromBody屬性支持將包含非基元類類型(不包括System.String)的任何屬性的查詢字符串傳遞給一個複雜對象。我有類似的問題,並創建了一個獨特的高級自定義模型綁定器FieldValueModelBinder類,以處理具有通用列表或數組集合的目標對象層次結構。我可以使用純粹的查詢字符串類型的源數據,而不用將任何JSON或XML結構嵌入它。模型聯編程序的使用可以像FromUri和FromBody屬性一樣簡單。它還可以有效地在URI和請求體中傳輸查詢字符串數據。

請使用以下鏈接閱讀我的文章和下載源代碼:http://www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects。您也可以從下載來源爲您的輸入字符串,模型和結果運行測試應用程序。我希望這是您需要的正確解決方案。

+0

這正好解決了我的問題!謝謝,歡迎來到:) –