【.Net MVC】 Post Javascript Array To List of T

  • 3629
  • 0
  • MVC
  • 2015-11-29

.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都說有風險了,就不建議去改預設值。