2013-07-17 27 views
3

以下一直讓我有些瘋狂。我發現了一些類似的問題,但他們沒有提供解決方案。我試圖發佈一個包含幾個數據項的json對象。其中之一是對象本身的列表。這裏是:發佈json到mvc 4 WebApi控制器操作。爲什麼不反序列化我的數組?

{ 
"ClaimType":"Trade", 
"ClaimedProductId":"4", 
"ClaimingUserId":"2", 
"Message":"test", 
"TradeOffers":[ 
    { 
    "OfferedProductId":"7", 
    "OfferedQuantity":"5" 
    }, 
    { 
    "OfferedProductId":"12", 
    "OfferedQuantity":"2" 
    } 
] 
} 

這json驗證。

我的控制器看起來是這樣的:

public class ProductController : ApiController 
{ 
    [HttpPost] 
    public void Claim(ClaimViewModel claimViewModel) 
    { 
     //do some amazing stuff with the data from the viewmodel. 
     //sorry guys. This stuff is just tooo cool to be posted here for all to see 
     //NOT ;-) 
    } 
} 

我張貼看起來像這樣ClaimViewModel:

public class ClaimViewModel 
    { 
    public Claim.ClaimRequestTypes ClaimType { get; set; } 
    public int ClaimedProductId { get; set; } 
    public int ClaimingUserId { get; set; } 
    public string Message { get; set; } 
    public List<TradeOffer> TradeOffers { get; set; } 
    } 

爲了完整起見,這裏的TradeOffer類:

public class TradeOffer 
{ 
    int OfferedProductId { get; set; } 
    int OfferedQuantity { get; set; } 
} 

之前我盯着從Javascript發佈,我喜歡使用Chrome RestConsole來測試這個壞男孩,所以我可以在罩下看起來更好一些。我做以下設置的請求:

  • 其POST請求
  • 主體內容類型是「應用/ JSON」
  • 我發送JSON作爲RAW身體
請求負載

接下來會發生什麼情況:我的ClaimViewModel上的所有屬性都會反序列化。但是,TradeOffers屬性得到實例化,並且在調試時顯示列表的計數爲2(迄今爲止這麼好),但此列表中的對象(屬性OfferedProductIdOfferedQuantity)的值始終爲0 /零(非空!)

+0

在您的JSON上,數組的字段名稱爲'TradeOffer';在你的類定義中它是'TradeOffers'。試着讓它們一樣,看看它是否有幫助。 – carlosfigueira

+0

如果您使用的是jquery,請嘗試在您的請求中設置「traditional:true」。 MVC不喜歡規範(或者我應該責怪它在m $) –

回答

7

屬性是私有的(默認訪問C#中的修飾符),這使得從外部設置它們變得不可能。嘗試製作它們public

public class TradeOffer 
{ 
    public int OfferedProductId { get; set; } 
    public int OfferedQuantity { get; set; } 
} 
+0

謝謝你們!這 - 非常簡單 - 監督修復了它!謝謝你指出! – Corstiaan

1

您在TradeOffer的房產真的是私人的嗎?如果是這樣,那些需要公開。

此外,

public List<TradeOffer> TradeOffers { get; set; } 

應該

public List<TradeOffer> TradeOffer { get; set; } 

還是應該的JSON集合中的名稱更改爲複數形式在TradeOffer

+0

謝謝你們!這 - 非常簡單 - 監督修復了它!謝謝你指出! – Corstiaan

相關問題