2015-06-14 105 views
1

我正在使用第三方庫,並且無法真正改變它將數據發佈到我的MVC 5控制器的方式。通過JSON向MVC控制器發送JavaScript參數字典

我不知道如何設置我的模型來接收數據。

的JSON是一種如下...

{ 
"expiration":"2015-06-14T21:02:52.969Z", 
"conditions":[ 
    {"acl":"private"}, 
    {"bucket":"anyoldbucket"}, 
    {"Content-Type":"application/pdf"}, 
    {"success_action_status":"200"}, 
    {"key":"somekey"} 
    ] 
} 

我試圖建立我的模型是這樣的...

public class AwsSignatureRequestViewModel 
{ 
    public DateTime expiration { get; set; } 
    public Dictionary<string, string> conditions { get; set; } 
} 

截止日期填寫正確,我也得到正確的條件數字,但字典的鍵是數字(索引)和值爲空

有什麼建議嗎?

+1

是否使用JSON.NET? –

+0

您可能必須爲條件創建單獨的模型並添加關係。 – Antariksha

回答

0

如果您的模型是嚴格的,您需要爲每個子對象創建對象。 但是,如果你有一個動態模型,你可以從你的請求中讀取原始字符串,並用Json.net解析它。

public ActionResult Test(string model) 
{ 
    Request.InputStream.Seek(0, SeekOrigin.Begin); 
    string jsonData = new StreamReader(Request.InputStream).ReadToEnd(); 
    var dynamicObject = JObject.Parse(jsonData); 
    ... 
} 

dynamicObject將包含所有的json。

+0

謝謝我能夠添加這一行來獲取數據到我的模型中。 var model = dynamicObject.ToObject (); –

+0

是的,對不起,我忘了將代碼行轉換爲您的模型。 – Demonia

0

IINM,根據你得到的數據,你應該AwsSignatureRequestViewModel看起來是這樣的:

public class AwsSignatureRequestViewModel 
{ 
    public DateTime expiration { get; set; } 
    public List<Dictionary<string, string>> conditions { get; set; } 
} 

conditions是一個「對象數組」。

你現在有你的模型的方式,數據將映射到這樣的事情(這是不是這樣):

{ 
    "expiration": "2015-06-14T21:02:52.969Z", 
    "conditions": 
    { 
     "acl": "private", 
     "bucket": "anyoldbucket", 
     .... 
    }, 
    ..... 

H個...

+0

這確實奏效,但Demonia下面的解決方案更適合我的用例,因爲我可以用我需要的結果來獲取單個字典而不是字典數組,謝謝 –

+0

@PhilipHey無論什麼作品。儘管依賴於你的用例,你甚至可能甚至不需要使用「控制器」,因爲在一天結束時,你真正需要的是獲得請求流數據(而不是通過「模型」)。心連心.. – EdSF