近日,在開發一個組件的過程中,需要通過Ajax對象向Asp.NET后端傳遞一個比較復雜的表單,表單中的一個字段是數組類型,我能想到的辦法是用JSON.stringify將前端的數組對象序列化成字符串,后端使用Newton.JsonConvert反序列化字符串。
這樣雖然可以解決問題,但是考慮到前端向后端傳遞數組數據我微軟肯定會提供更好的解決方案。服務器端肯定可以接收數組類型的數據,只是目前ajax對象向后端傳遞的數據格式並不符合要求,通過chrome的控制台觀察到前端向后端傳遞的字節數據格式形如ResourceIds[]=3&ResourceIds[]=10&ResourceIds[]=11&ResourceIds[]=17,但是對於后端對數組數據的格式標准並不清楚,首先想到是用dotpeek反編譯.NET代碼,但是這樣比較浪費時間,而且不知道Asp.NET負責調用Action的程序集是哪個,這個方法想想就算了。直接百度試試能不能解決,結果沒有找到適合的答案。翻牆上google輕松找到解決方案,原來Asp.NET后端要求的數據格式形如ResourceIds=3&ResourceIds=10&ResourceIds=11&ResourceIds=17,ajax對象為了適應如PHP和Ruby on Rails框架的傳參方式增加了一個設置traditional, traditional指的是ajax序列化參數的方式,默認設置為false,即深度序列化,數據傳遞的過程中的形如
ResourceIds[]=3&ResourceIds[]=10&ResourceIds[]=11&ResourceIds[]=17
深度序列化,以適應如PHP和Ruby on Rails框架;
傳統的傳參方式ResourceIds=3&ResourceIds=10&ResourceIds=11&ResourceIds=17
上Demo
前端
var ResourceIds = [3,10];
$.ajax({
url: url,
data: { ResourceIds:ResourceIds },
type: "post",
traditional: true,
success: function(data) {
if (data.Code == 20000) {
alert("操作成功");
window.location.href = window.location.href;
return;
} else {
alert("操作失敗請重試");
}
},
error: function () {
alert("操作失敗請重試");
}
});
后端
public JsonResult Add(int[] ResourceIds)
{
return Json(SourceService.AddRole(ResourceIds, User));
}
參考資料
https://my.oschina.net/i33/blog/119506
http://stackoverflow.com/questions/5489461/pass-array-to-mvc-action-via-ajax
