亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

再談Jquery Ajax方法傳遞到action(補充)

2019-11-20 15:33:52
字體:
來源:轉載
供稿:網友

之前寫過一篇文章Jquery Ajax方法傳值到action,本文是對該文的補充
假設 controller中的方法是如下:

復制代碼 代碼如下:

public ActionResult ReadPerson(PersonModel model) 
        { 
            string s = model.ToString(); 
            return Content(s); 
        }

public ActionResult ReadPersons(List<PersonModel> model) 
        { 
            string result = ""; 
            if (model == null) return Content(result); 
            foreach (var s in model) 
            { 
                result += s.ToString(); 
                result += "-------------"; 
            }
            return Content(result); 
        }

其中PersonModel定義如下:

復制代碼 代碼如下:

public class PersonModel 
    { 
        public int id 
        { 
            set; 
            get; 
        } 
        public string name 
        { 
            set; 
            get; 
        }

        public int age 
        { 
            set; 
            get; 
        }

        public bool gender 
        { 
            set; 
            get; 
        } 
        public string city 
        { 
            set; 
            get; 
        }

        public override string ToString() 
        { 
            string s = string.Format(@"id:{0} 
name:{1} 
age:{2} 
gender:{3} 
city:{4} 
", id, name, age, gender, city); 
            return s; 
        } 
    }

那么controller方法分別接受單個model和一個model的List。采用通過ajax傳遞參數。
對于傳遞單個參數的情況,假設js代碼如下:

復制代碼 代碼如下:

var person = { 
               id: "001", 
               name: "zhangsan", 
               age: "20", 
               gender: true, 
               city: "shanghai" 
           };

var option = { 
               url: '/test/ReadPerson', 
               type: 'POST', 
               data: person, 
               dataType: 'html', 
               success: function (result) { alert(result); } 
           }; 
$.ajax(option);

從chrome中截圖可以看到如下:
clipboard_thumb

傳遞的數據是一串Form數據,根據命名匹配的原則,也是可以取得數據的。
image_thumb

將option 的代碼改成如下

復制代碼 代碼如下:

var option = { 
               url: '/test/ReadPerson', 
               type: 'POST', 
               data: JSON.stringify(person), 
               dataType: 'html', 
               success: function (result) { alert(result); } 
           }; 
$.ajax(option);

其中JSON.stringify方法簽名為 stringify ( value [ , replacer [ , space ] ] ),根據ECMA-262標準stringify 函數返回的是JSON格式的字符串。它可以有3個參數。摘抄如下:
The stringify function returns a String in JSON format representing an ECMAScript value. It can take three parameters. The first parameter is required. The value parameter is an ECMAScript value, which is usually an object or array, although it can also be a String, Boolean, Number or null. The optional replacer parameter is either a function that alters the way objects and arrays are stringified, or an array of Strings and Numbers that acts as a white list for selecting the object properties that will be stringified. The optional space parameter is a String or Number that allows the result to have white space injected into it to improve human readability.
默認的ContentType的屬性值是"application/x-www-form-urlencoded"
引自http://www.w3.org/TR/html401/interact/forms.html#adef-enctype

看請求頭的截圖:

clipboard[4]_thumb

因此,傳遞到controller的是一個json字符串,MVC根據命名匹配也是可以獲得到參數的值。

將將option 的代碼改成如下

復制代碼 代碼如下:

var option = { 
                url: '/test/ReadPerson', 
                type: 'POST', 
                data: person, 
                dataType: 'html', 
                 contentType: 'application/json', 
                 success: function (result) { alert(result); } 
                }; 

把contentType改成json格式,那么得到的是出錯的信息。
雖然person是json對象,但是jquery中的ajax,data會自動的被轉換成查詢字符串格式key1=value1&key2=value2這種形式,很顯然這種形式不是json格式,因此會出錯。
要避免轉換成查詢字符串格式,只需要設置processData為fasle即可。processData默認是true。
這里需要注意的是:當指定了contentType的時候,數據將不再按照Form Data的形式提交了,而是變成Request Data的形式提交??梢詮膱D上的Request Header中看出。需要注意的是,Form Data提交的數據可以由FormCollection獲得到。Request Data方式提交的則不能通過FormCollection獲得。
如果把processData設置為默認值true。

image_thumb[3]

如果把processData設置為false。

image_thumb[2]

以上兩種方式,按照application/json的類型傳給都會失敗,因為json是基于文本的格式,上面兩種方式傳遞的都不是json文本。因此會出錯。

因此,把option改成:

復制代碼 代碼如下:

var option = { 
    url: '/test/ReadPerson', 
    type: 'POST', 
    data:JSON.stringify(person), 
    dataType: 'html', 
    contentType: 'application/json', 
    success: function (result) { alert(result); } 
}; 

則傳遞的就是json文本,因此根據命名匹配,就能獲得值了。

clipboard[8]_thumb

對于較為簡單是數據類型,有時候不指定contentType也能通過命名匹配傳值。但是對于稍微復雜點的數據類型,有時指定contentType: 'application/json',處理起來更加方便。
如果一個controller里的action方法是接受一個List類型的參數,比如:
public ActionResult ReadPersons(List<PersonModel> model)
那么js中先構造這樣的一個json對象的數組。如下

復制代碼 代碼如下:

var persons = [{
                id: "001",
                name: "zhangsan",
                age: "20",
                gender: true,
                city: "shanghai"
            },
            {
                id: "002",
                name: "lisi",
                age: "21",
                gender: false,
                city: "beijing"
            }
            ];

單純一個數組傳遞是作為data傳遞是,Form Data也是無法識別出的。因此把這個數組再次組成一個json形式。如下:其中json的鍵值用model是為了能和controller中的參數名相同,可以匹配。

復制代碼 代碼如下:

var jsonp = { model: persons };
           var option = {
               url: '/test/ReadPersons',
               type: 'POST',
               data: jsonp,
               dataType: 'html',
               success: function (result) { alert(result); }
           };

由于未指定contentType,因此是默認的application/x-www-form-urlencoded。此時是按照Form Data的方式傳遞的,

clipboard

可以從截圖中看到。但是這種格式的數據,controller中只能獲得指定model用2個元素,無法獲得元素中屬性的值。

clipboard[1]

如果把data改成JSON.stringify(jsonp),如下:   

復制代碼 代碼如下:

var option = {
              url: '/test/ReadPersons',
              type: 'POST',
              data: JSON.stringify(jsonp),
              dataType: 'html',
              success: function (result) { alert(result); }
          };

clipboard[2]

那么傳遞過去的Form Data是一串字符串,controller跟無法識別出這個東西,因此獲不到值。如果僅僅設置contentType: 'application/json',而傳遞的又不是json格式的數據,如下:

那么傳遞過去的Form Data是一串字符串,controller跟無法識別出這個東西,因此獲不到值。如果僅僅設置contentType: 'application/json',而傳遞的又不是json格式的數據,如下:

復制代碼 代碼如下:

var option = {
    url: '/test/ReadPersons',
    type: 'POST',
    data: jsonp,
    dataType: 'html',
    contentType: 'application/json',
    success: function (result) { alert(result); }
};

因為jquery的ajax方法會把data轉換成查詢字符串,因此就變成如下的樣子。這串文本當然不符合json格式,因此會出現下面的錯誤。

clipboard[3]

clipboard[4]


如果設置contentType: 'application/json',并且設置data: JSON.stringify(persons),如下:

復制代碼 代碼如下:

var option = {
                url: '/test/ReadPersons',
                type: 'POST',
                data: JSON.stringify(persons),
                dataType: 'html',
                contentType: 'application/json',
                success: function (result) { alert(result); }
            };

那么可以獲得到真正完整的json數據了

clipboard[5]


最后,此處再演示一個更復雜的參數類型,以便加深理解。
首先看一下Controller中的方法簽名,TestClassB 和一個TestClassA的List。稍顯復雜。

復制代碼 代碼如下:

public ActionResult Fortest(TestClassB TB,List<TestClassA> TA)
        {
            string result = "";
            return Content(result);
        }

再看TestClassA和TestClassB,更顯復雜。但是結構要清晰的話,也不是很難。

復制代碼 代碼如下:

public class TestClassA
    {
       public string a1 { set; get; }
       public List<string> a2 { set; get; }
    }
    public class TestClassB
    {
        public string b1 { set; get; }
        public InnerTestClassC ITCC { set; get; }
        public class InnerTestClassC
        {
            public List<int> c1 { set; get; }
        }
    }

看js代碼:逐步的構造出一個json格式。

復制代碼 代碼如下:

$("#btn").click(function () {
            var jsondata = { TB: {}, TA: [] };
            jsondata.TB.b1 = "b1";
            jsondata.TB.ITCC = {};
            jsondata.TB.ITCC.c1 = new Array(1, 2, 3, 4);
            var ta1 = {};
            ta1.a1 = "a1";
            ta1.a2 = new Array("a", "b", "x", "y");
           var ta2 = {};
            ta2.a1 = "a2";
            ta2.a2 = new Array("a2", "b2", "x2");
            jsondata.TA.push(ta1);
            jsondata.TA.push(ta2);
            var option = {
                url: '/test/Fortest',
                type: 'POST',
                data: JSON.stringify(jsondata),
                dataType: 'html',
                contentType: 'application/json',
                success: function (result) { alert(result); }
            };
            $.ajax(option);
        });

最終,發送出去的json字符串如下:
{"TB":{"b1":"b1","ITCC":{"c1":[1,2,3,4]}},"TA":[{"a1":"a1","a2":["a","b","x","y"]},{"a1":"a2","a2":["a2","b2","x2"]}]}
Controller接收到這個json串后,就能自動的匹配參數了。具體得到的參數如下截圖:

clipboard[6]

clipboard[7]

總結:

1.不指定contentType的話,默認都是application/x-www-form-urlencoded方式發送。此時即便發送的是json格式的數據,默認情況下,jquery的ajax也會把他轉為查詢字符串的形式(可以通過修改ajax參數修改),以FormData的形式發送出去。
2.不指定contentType的時候,如果controller中的方法簽名比較簡單,那么即便是FormData形式的數據也能由MVC的命名匹配規則獲取到數據。
3.指定contentType為'application/json'時候,發送的數據必須是符合json規范的字符串。通常,使用 JSON.stringify(jsondata)有較好的可讀性,可以獲得一個json字符串。當然,不是必須的。使用拼接的字符串,只要是符合json規范的,也是可以發送的。
4.如果contentType為'application/json'時,發送的data不是符合json規范的字符串,則會出錯。
5.通常情況下,盡量指定contentType為'application/json',并且發送json字符串作為發送數據,這樣可讀性更好,并且對于復雜的函數簽名,也能起到很好的匹配。

本文出自 “一只博客” 博客

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产999| 国产v综合v亚洲欧美久久| 国产精品99久久久久久久久久久久| 精品国产一区二区三区久久狼5月| 国产亚洲a∨片在线观看| www.美女亚洲精品| 中文字幕亚洲自拍| 亚洲免费视频一区二区| 国产91在线播放| 亚洲欧美成人一区二区在线电影| 欧美亚洲在线观看| 国外成人在线直播| 欧美成人免费大片| 亚洲第一天堂av| 欧美性猛交丰臀xxxxx网站| 久久久国产视频91| 久久久亚洲欧洲日产国码aⅴ| 欧洲美女7788成人免费视频| 日本精品久久久| 欧美激情成人在线视频| 亚洲国产精品国自产拍av秋霞| 国产精品69久久| 92国产精品久久久久首页| 国产原创欧美精品| 亚洲精品美女在线观看播放| 久久69精品久久久久久久电影好| 国产成人精品在线播放| 欧美—级a级欧美特级ar全黄| 久久伊人精品一区二区三区| 亚洲精选一区二区| 日韩视频欧美视频| 亚洲成人在线视频播放| 欧美精品一区二区三区国产精品| 久久99国产精品自在自在app| 韩剧1988在线观看免费完整版| 色av吧综合网| 久久91超碰青草是什么| 成人福利在线视频| 欧美日韩亚洲网| 97在线视频观看| 国产亚洲a∨片在线观看| 日韩中文字幕不卡视频| 日本中文字幕不卡免费| 欧美成人第一页| 日韩精品久久久久久久玫瑰园| 亚洲国产成人av在线| 精品国产1区2区| 日韩欧美在线看| 亚洲黄一区二区| 精品一区二区三区电影| 国产欧美一区二区三区久久| 日韩av一区二区在线观看| 午夜欧美大片免费观看| 精品国产一区二区三区在线观看| 久久久97精品| 欧美激情18p| 成人a免费视频| 青青草成人在线| 不卡在线观看电视剧完整版| 国产美女被下药99| 久热精品视频在线观看| 亚洲第一精品夜夜躁人人躁| 欧美精品在线播放| 国产亚洲精品综合一区91| 姬川优奈aav一区二区| 久久偷看各类女兵18女厕嘘嘘| 亚洲精品www久久久久久广东| 久久伊人精品一区二区三区| 4388成人网| 亚洲欧美综合另类中字| 欧美性xxxxxxx| 久久久久国色av免费观看性色| 欧美激情视频一区二区| 亚洲福利视频在线| 国产噜噜噜噜久久久久久久久| 国产精品视频区1| 亚洲视频在线观看网站| 国产精品美女午夜av| 国产成人精品国内自产拍免费看| 麻豆成人在线看| 色婷婷综合成人av| 亚洲精品日韩激情在线电影| 中文字幕精品影院| 欧美亚洲另类视频| 亚洲免费av网址| 国产精品日韩一区| 国产欧美日韩中文| 成人中文字幕+乱码+中文字幕| 97成人精品区在线播放| 精品国产欧美一区二区五十路| 国产精品69精品一区二区三区| 亚洲免费中文字幕| 亚洲精品美女久久久| 在线视频亚洲欧美| 欧美日韩高清区| 欧美激情乱人伦| 久热国产精品视频| 国产精品www色诱视频| 亚洲第一av网| 另类美女黄大片| 欧美精品电影在线| 日本一区二区在线播放| 97久久精品人搡人人玩| 日韩欧美在线视频日韩欧美在线视频| 亚洲国产欧美一区| 欧美高清性猛交| 亚洲va久久久噜噜噜久久天堂| 日韩精品黄色网| 久久久久久91香蕉国产| 91免费看片网站| 亚洲已满18点击进入在线看片| 在线观看欧美www| 日韩av一区二区在线观看| 国产成人+综合亚洲+天堂| 国产美女久久精品香蕉69| 久久精品中文字幕| 久久久久99精品久久久久| 国产欧美日韩精品专区| 亚洲精品国产免费| 日韩欧美在线第一页| 亚洲无线码在线一区观看| 亚洲无限乱码一二三四麻| 精品国产欧美一区二区三区成人| 亚洲xxxxx性| 国产精品第一页在线| 日韩精品久久久久久久玫瑰园| 亚洲字幕一区二区| 日韩欧美亚洲成人| 2024亚洲男人天堂| 久久夜精品va视频免费观看| 国产丝袜一区视频在线观看| 亚洲国产高清自拍| 日韩欧美在线国产| 日韩精品视频在线| 久久久女人电视剧免费播放下载| 亚洲视频免费一区| 日韩有码视频在线| 在线观看精品自拍私拍| 日韩在线观看免费全| 亚洲欧美日韩精品久久亚洲区| 日韩亚洲在线观看| 亚洲在线免费看| 国产在线观看不卡| 国产欧美精品久久久| 一区二区三区亚洲| 色噜噜亚洲精品中文字幕| 欧美做爰性生交视频| 播播国产欧美激情| 欧美性猛交xxxx免费看漫画| 91久久国产精品| 中文字幕日本欧美| 欧美精品午夜视频| 黑人巨大精品欧美一区二区| 26uuu另类亚洲欧美日本老年| 91中文在线视频| 欧美日韩激情视频| 91国语精品自产拍在线观看性色| 国产精品视频最多的网站| 亚洲国产精品va在看黑人| 亚洲四色影视在线观看| 亚洲激情在线观看| 亚洲jizzjizz日本少妇| 欧美夫妻性生活视频| 国产精品久久97|