2014-02-14 53 views
1

我有以下JavaScript代碼,建立一個對象數組,我試圖通過ajax文章推送到一個asp.net-mvc行動。我想弄清楚下面這個錯在哪裏?如何通過Ajax將對象數組從javascript傳遞給asp.net-mvc函數?

的javascript:

var arr = []; 
for (var i = 0; i < 5; i++) { 
    var obj = { 
     statusId: i, 
     resizeable: true, 
     rows: [1, 2, 3, 4, 5] 
     }; 
     arr.push(obj); 
} 

$.ajax({ 
    type: 'POST', 
    traditional: true, 
    url: '/MyController/UpdateMe', 
    data { info: arr }, 
    success: function() { 
     alert("complete"); 
    } 
}); 

C#asp.net-MVC動作:

public ActionResult UpdateMe(IEnumerable<UpdateInfo> info) 
{ 
    foreach (var item in info) 
    { 
      Console.Write(item.statusIs + " has + " item.rows.length() + " items "); 
    } 
} 

public class UpdateInfo 
{ 
    public int statusId {get;set;} 
    public bool resizable {get;set;} 
    public List<int> rows {get;set;} 
} 
+0

你錯過引用「/ MyControoller/UpdateMe」?另外,「控制器」似乎拼錯了。 – linstantnoodles

+0

@linstantnoodles - 對不起,這只是一個錯誤的問題。更新 – leora

回答

3

默認jQuery.ajax contentType是application/x-www-form-urlencoded。這意味着參數以url字符串形式發送。在你的情況下,你的數組轉換爲字符串:object&object&object....

要改變這種behavoir,你應該在jQuery.ajax改變的contentType到application/json和你的JS對象轉換成JSON與JSON.stringify

$.ajax({ 
    type: 'POST', 
    traditional: true, 
    contentType: 'application/json', 
    url: '/SchoolDetails/UpdateMe', 
    data: JSON.stringify({ info: arr }), 
    success: function() { 
     alert("complete"); 
    } 
}); 

行動在調試:

enter image description here

+0

注意:「UpdateMe」動作也必須用'[HttpPost]'標記。 – McGarnagle

+0

它不一定。動作上的屬性僅影響過濾請求方法,即如果添加'HttpPost'屬性,則動作將只接受發佈請求,如果動作沒有http屬性,則它將接受所有請求方法。 – alexmac

+0

@亞歷山大 - 這幾乎適用於我。我現在看到信息數組正在填充在服務器上,但是當我查看數組時,每個項目都填充了statusId,但其中的rows數組已經爲空(請參閱更新後的問題) – leora

0

不能傳遞一個JS陣列在POST請求中的參數。你必須把它變成一個字符串來傳遞給.NET動作。考慮使用jQuery.param()來做到這一點。它會將對象轉換爲像statusId=valueOfI&resizeable=true這樣的字符串。然後你在動作中接收它之後將它從一個字符串改回到一個數組(因爲我不知道.NET,所以我不能建議一個函數)。

相關問題