2012-04-04 137 views
16

我一直在努力尋找解決此問題的方法。將數組作爲JSON傳遞給MVC控制器

在我的代碼中,我構建了一個對象的數組;

var $marks = []; 

var mark = function (x, y, counter){ 
    this.x = x; 
    this.y = y; 
    this.counter = counter; 
} 

$marks.push(new mark(1, 2, 0)); 
$marks.push(new mark(1, 2, 1)); 
$marks.push(new mark(1, 2, 2)); 

現在我想這個數據發佈到一個MVC控制器,所以我認爲,在控制器中的數據類型將是一個List<Mark> Marks或標記的數組。

要發佈數據,我試過了;

var json = JSON.stringify($marks); 
$.post('url', json).done(function(data){ /* handle */ }); 

OR

var json = { Marks: $marks }; 
$.post('url', json).done(function(data){ /* handle */ }); 

第二種方式,望着發佈數據時,看起來像這樣

Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 0 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 1 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 2 

但我不知道如何翻譯成一個強類型對象本在控制器中?

我的控制器看起來像這樣;

[HttpPost] 
public ActionResult JsonSaveMarks(List<Mark> Marks){ 
    // handle here 
} 

我的馬克班看起來像這樣;

public class Mark{ 
    public string x { get; set; } 
    public string y { get; set; } 
    public string counter { get; set; } 
} 

我已經通過有關創建自定義JsonFilterAttribute,或使用System.Web.Script.Serialization.JavaScriptSerializer類其他類似問題閱讀,但我不能得到任何工作

有什麼明顯的,我在這裏失蹤?我有控制器中的DataType完全錯誤嗎?如何將這些數據轉換爲強類型對象?

非常感謝

+0

你在MVC中的Mark-class是什麼樣的? – Pbirkoff 2012-04-04 08:52:45

+0

@Pbirkoff我已更新與類 – 2012-04-04 08:55:13

+1

檢查此問題,尤其是第一個答案的問題:http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp -net-mvc3 – Pbirkoff 2012-04-04 09:03:47

回答

14

$.post()不允許你設置你的AJAX調用的內容類型 - 你可能會發現(如果你使用Fiddler),您的JSON字符串被與內容型「應用發送/ x-www-form-urlencoded「(默認設置),然後導致Asp.Net MVC錯誤地解釋你的數據包。

您可以嘗試使用$.ajax()代替,並將內容類型設置爲「application/json」?

http://api.jquery.com/jQuery.ajax/

+0

啊,你打我吧,有同樣的想法 – Pbirkoff 2012-04-04 09:05:23

+1

謝謝!在我頭痛之後,我知道這會很簡單!更改我的代碼使用'$ .ajax()'也傳遞數據通過'JSON.stringify($馬克)' – 2012-04-04 09:20:13

+0

非常感謝。這是我的情況下的內容類型。 – Jelling 2013-03-22 22:10:48

13

@SteveHobbs這裏有正確的答案。另一方面,你應該像JavaScript一樣負責JavaScript的有效載荷。如果以相反的方式執行此操作,則會在反序列化進入的數據時收到異常,例如「無效的JSON基元」

下面是完整的解決方案,您的樣本:

$.ajax({ 

    url: '/home/index', 
    type: 'POST', 
    data: JSON.stringify($marks), 
    dataType: 'json', 
    contentType: 'application/json', 
    success: function (data, textStatus, jqXHR) { 
     console.log(data); 
    } 
}); 
1

此代碼固定我的問題:

C#類:

public class MediaAccountContent 
{ 
    public Guid IdMedia { get; set; } 
    public string Value { get; set; } 

} 

public class User 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public List<MediaAccountContent> MediaAccountContents { get; set; } 
} 

MVC行動:

public ActionResult SavePlace(User user) 
{ 

    return Content("OK"); 
} 

Javascript:

var mediaAccountsJson = []; 

    for (var i = 0; i < 10; i++) 
    { 
     mediaAccountsJson.push({ 
      IdMedia: i, 
      Value: "AAA" + i 
     }); 

    } 

    var datatItem = 
    { 
     Firstname: "Test Firstname", 
     Lastname: "Test Lastname", 
     MediaAccountContents: mediaAccountsJson 
    }; 

    $.ajax({ 
     type: "POST", 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify(datatItem), 
     url: urlAction, 
     success: function (status) { 



     } 
    }); 

根據您的場景進行所需的更改並享受! :)

+0

這段代碼只發布json對象而不是對象數組 – mzonerz 2016-11-02 10:35:47

相關問題