.Net MVC Post Javascript Array To List<T>
繞了不小一圈,才發現原來事情很單純。
又是基礎的問題。
假設,我們在.net MVC的Action中,要接收List<T>的資訊,那在Client端的Script該怎麼寫呢!?
一開始,我參考了:黑暗執行緒的文章 使用jQuery.ajax傳送物件陣列給ASP.NET MVC
這個道理我瞭解,所以,我就跟著道理走。
寫了很多程式,也都執行的很順利,但,當我遇到我的List<T>中,還有List<T>的Property時,這條路就有需要調整。
看到下方有人有寫另外一種解決方法:David .Net ASP.NET MVC Tip : 如何透過 Form Post傳遞array資料(非使用ajax時)
嘗試以後,也執行順利。
但,下方有段文字讓我又覺得奇怪了。
在ASP.NET MVC3 時,有改進了一個功能,可以在 ajax 呼叫時,輕鬆的利用JSON格式傳遞資料到Server端並自動繫結。
摘錄自文章內。
好拉!問題是,我的情況就是用ajax方式,而且,我的開發環境是MVC 4。
但,我嘗試用我原本的Code去丟,還是不Work。
function AjaxClick() {
$.ajax({
url: XXURL,
dataType: 'json',
type: 'POST',
data: JSON.stringify({
GridData: GridData
}),
success: function (data) {
},
error: function (response) {
},
complete: function () {
}
});
}
雖然,正常的Post,但我的Action中,List<T> GridData還是一樣無資料。
後來,又查了一下找到一篇文章:jQuery post array - ASP.Net MVC 4
文章中,我看到了重點:
MVC detects what type of data it receive by contentType
結果,很明顯,因為我原本的寫法根本沒指定contentType。
所以,調整成下列方式就OK了。
function AjaxClick() {
$.ajax({
url: XXURL,
dataType: 'json',
contentType: 'application/json; charset=utf-8',
type: 'POST',
data: JSON.stringify({
GridData: GridData
}),
success: function (data) {
},
error: function (response) {
},
complete: function () {
}
});
}
如果不清楚contentType是做什麼用的,可以參考:
1.jQuery官網:http://api.jquery.com/jquery.ajax/
2.簡體版本:http://fanli7.net/a/w3school/jquery/ajax_ajax.html
做個筆記,如果未來遇到MVC3以下的,我個人會選擇David .Net的解法,否則,用內建的解法就好了。
2015/8/2 更新:
透過最後的方式去Post Json字串,讓Controller直接做ModelBind動作。有個限制。
請看MSDN:https://msdn.microsoft.com/zh-tw/library/hh975440%28v=vs.120%29.aspx
指定 JavaScriptSerializer 型別還原序列化的任何字典中可存在的項目數目上限。預設值是1000。
所以,當今天你Post出去的Json項目數超過1000個,就會發生Exception,The JSON request was too large to be deserialized
MSDN也有提,若修改預設值可能會有資安風險。
印象這跟某年Webform的資安更新,將Request的項目數上限限制為1000個,應該是有異曲同工之妙。
解決方法:將最大的數量轉換成字串回到Server端透過Json.Net的Deserialized還原成List。
既然MSDN都說有風險了,就不建議去改預設值。