2012-09-20 18 views
0

發佈JSON數據到一個MVC行動時,我有一個問題,ASP.NET MVC 4。JSON數組不正確的反序列化

我用Dictionary<string, string[]>表示含有多個命名陣列javascript對象。但是,而不是在一個關鍵的存儲陣列值,每個數組值有其自己的密鑰

var data = { 
    foo1: { bar1: ['a', 'b', 'c' ], bar2: ['z'] }, 
    foo2: { bar3: ['d', 'e' ] } 
}; 
$.ajax({ 
    url: '/mvc/SomeAction', 
    type: 'POST', 
    data: data, 
    dataType: 'json', 
    contentType: 'application/json', 
    success: myCallback 
}); 

我的MVC模式是這樣的:

public class Data 
{ 
    public Dictionary<string, string[]> foo1 { get; set; } 
    public Dictionary<string, string[]> foo2 { get; set; } 
} 

[HttpPost] 
public JsonResult SomeAction(Data data) 
{ 
    // Instead of having a key named bar1 with the value as an array of strings, 
    // this is what I get: 
    // data.foo1 = 
    // { 
    //  (key: "bar1[0]", value: null), 
    //  (key: "bar1[1]", value: null), 
    //  (key: "bar1[2]", value: null), 
    //  (key: "bar2[0]", value: null) 
    // } 
    // etc.. 
} 

這似乎是MVC模型綁定不正確地反序列化json到數據模型。

這僅如果字典的值是數組,如果是它按預期另一個目的發生。

如何解決這個任何想法非常讚賞。

在我將不得不使用JSON.stringify和解析服務器上的串最壞的情況,但感覺不對。

+1

這正是應該發生的。傳入數據的數組應該被轉換爲索引元素。任何一種'IEnumerable'都會以'var [N]'結尾,其中'var'是標識符名稱,'N'是一個索引。 –

+0

@BradChristie你能解釋爲什麼它應該是這樣嗎?我期望的關鍵是「bar1」,值是「[」a「,」b「,」c「]'。 –

+0

我正在elluding到的是,協議預計,如果一個單獨的變量名稱具有多個值,而不是'富= 1,2,3'請求是代替'FOO [] = 1&FOO [] = 2&FOO [] = 3 '。現在,就MVC爲什麼沒有正確翻譯,我不確定。但是你已經展示了它應該如何通過電線發送。 –

回答

0

可以使用this plugin for jQuery轉換JSON數據:

var data = $.toDictionary({ 
    foo1: { bar1: ['a', 'b', 'c' ], bar2: ['z'] }, 
    foo2: { bar3: ['d', 'e' ] } 
});