2013-02-03 27 views
1

我有一個Web API方法定義如下:如何在定義良好的模型中反序列化動態屬性?

[HttpPost] 
public void Post(Input model) 
{ 
    ... 
} 

隨着輸入模式是這樣的:

public class Input 
{ 
    public string Id { get; set; } 
    public object Extra { get; set; } 
} 

我想要做的是通過一個有效的JSON對象類似如下的額外的參數例如使用jQuery:

$.post(
    'http://localhost/api/myController', 
    { 
     id: 'someId',    
     extra: { 
      tags: ['a', 'b'], 
      anotherValue: 'hello', 
      oneMore: { 
       foo: 'bar' 
      } 
     } 
    }); 

標識來正確地進入我的model.Id財產。然而,額外財產來作爲{對象},因爲我不知道什麼在那裏我不能以任何方式反序列化它。

我試圖使它動態和/或將它強制轉換爲動態/ ExpandoObject/Dictionary沒有成功。我知道如果我只是收到一個原始的HttpRequestMessage並自己處理它,我可能會使它工作。 Hoever,我寧願不這樣做,並依靠.NET的所有驗證。

可能嗎?

感謝

編輯1:測試一些更多的選擇我發現額外屬性沒有任何實際價值,它只是初始化爲新的對象()後。看起來像默認的模型綁定器實現不處理動態JSON(至少不是這樣),只是簡單地調用它無法處理的模型屬性的默認構造函數。

+0

@SanjaMelnichuk我不明白這是如何幫助我的。我沒有可用於傳遞到解串器的JSON字符串。我所擁有的就是模型對象。 – tucaz

回答

0

將您的物業定義爲object應該可行,或者如果您想明確表明您的Extra物業屬於JObject

但問題出在$.post請求。爲了複雜的數據張貼到web.api方法,並允許模型綁定,你需要做兩件事情:

  • 內容類型設置爲「應用/ JSON的」
  • 與發送數據的JSON呼籲JSON.stringify

但隨着$.post所以你需要使用$.ajax你不能指定內容類型:

所以下面的調用應的數據發佈到你的行動:

$.ajax({ 
    url: 'http://localhost/api/myController', 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify(
    { 
     id: 'someId',    
     extra: { 
      tags: ['a', 'b'], 
      anotherValue: 'hello', 
      oneMore: { 
       foo: 'bar' 
      } 
     } 
    }) 
}); 
+0

它工作@nemesv!謝謝:)不過,還有一件事:調用者需要在不這樣做時更容易將數據串聯起來。有沒有另一個來電者不必這樣做?我可以爲我的消費者提供一個JS客戶端,但是如果他們想要自己構建它,那麼不使用stringify會簡單多了。再次感謝! – tucaz

+0

@tucaz通常,如果客戶端發送有效的JSON負載就足夠了。但是,如果客戶端使用JQuery實現,因爲'$。ajax'方法調用將:[數據被轉換爲查詢字符串,如果還沒有字符串。](http://api.jquery.com/jQuery.ajax/)所以你需要調用'JSON.stringify',否則'.ajax' url會對您的數據進行編碼。但是如果你有其他客戶,那麼就不需要調用'JSON.stringify' – nemesv

相關問題