2011-10-28 52 views
14

當我送INT的列表使用jQuery這樣的:如何用jQuery發送INT的列表ASP.net MVC默認模型綁定

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

然後jQuery將變換pkList對象,並通過發送發佈這樣的:

pkList[]:1 
pkList[]:2 
pkList[]:3 

如果服務器是PHP這將是很好,但我使用Asp.NET MVC3,並嘗試用默認的模型綁定來獲取這些值:

public ActionResult Execute(ICollection<int> pkList) 

但pkList始終爲空,似乎默認的模型聯編程序無法將其綁定。

如何正確解決此問題?


ADDEDSOLUTION

我使用達林季米特洛夫的解決方案與設定的jQuery的traditional選項:

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    traditional: true, 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

現在的jQuery不將[]添加到參數並且它們是這樣發送的:

pkList:1 
pkList:2 
pkList:3 

而MVC默認模型聯編程序正確地獲取值。

希望這可以幫助別人。

回答

16

你可以使用一個JSON請求,因爲它可以讓你給你希望的任何複雜的對象:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ pkList: [1, 2, 3] }), // you could throw any javascript object you like here 
    success: function(result) { 
     // process the results 
    } 
}); 

JSON.stringify方法是建立在現代瀏覽器,如果你想支持傳統瀏覽器,你可以包括json2.js腳本到您的網站。

並回答你的問題,你可以使用設置traditional: true選項指示jQuery的,因爲這在jQuery的1.4已經改變退卻到傳統系列化的參數,如果你使用的是更高版本,你需要切換的可能性返回的路上參數進行序列化:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    data: { 
     pkList: [1, 2, 3] 
    }, 
    traditional: true 
}); 
+0

不會默認的模型綁定還可以處理用逗號分隔表單編碼數據的列表?就像'data:{pkList:'1,2,3'}'?但除此之外,我使用這種方法來處理我所有的模型序列化,這是JS中更復雜對象的方法。 –

+0

@PaulT。,不,默認的模型聯編程序不會接受'data:{pkList:'1,2,3'}'。如果你想處理這樣的請求,那麼需要自定義模型聯編程序,你需要拆分條目然後將每個條目解析回整數。如果目標是將整數數組發送到控制器操作,則不必經歷這種痛苦。 –

+0

啊是的,我明白你的意思,只是測試它,它的奇怪,但因爲如果你有兩個同名的輸入,它實際上反序列化到一個列表,只是jQuery的序列化形式發佈數據並不處理(即pkList = 1&pkList = 2 works) –

0

Phil Haack在他的博客上有一篇很棒的文章,應該直接指出你的意思。

Model Binding To A List

+0

感謝隊友,我之前讀,但它並不能幫助我,問題是更上了jQuery側:) – Marc