博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Ajax方法提交多个对象数组的问题
阅读量:6813 次
发布时间:2019-06-26

本文共 2500 字,大约阅读时间需要 8 分钟。

hot3.png

当用$.ajax()向后台提交参数时,如果参数中数组的话一般在后台会用List<T>接收;但老是不成功如下面代码

var arr1 = [{ "Name": "Tom", "Age": 17 }, { "Name": "Jim", "Age": 22}];var arr2 = [{ "Name": "Tom2", "Age": 18 }, { "Name": "Jim2", "Age": 24}];    $(function () {        $.ajax({            url: '/Home/UserAdd',            data: {list1:arr1,list2:arr2},            success: function (msg) {                if (msg == '1') {                    console.log('添加成功');                } else {                    console.log('添加失败');                }            }        });    })
用Fiddler 监测之后发觉数据变成啦

list1[0][Name]:Tom

list1[0][Age]:17
list1[1][Name]:Jim
list1[1][Age]:22
list2[0][Name]:Tom2
list2[0][Age]:18
list2[1][Name]:Jim2
list2[1][Age]:24
C#中能识别的数组应该是这样的格式

list1[0].aa=1&list1[0].bb=2&list1[1].aa=3&list1[1].bb=4&list2[0].aa=1&list2[0].bb=2&list2[1].aa=3&list2[1].bb=4

在网上查找资料之后了解到ajax post之前会用因为jQuery需要调用jQuery.param序列化参数,我们来看下jquery源码

//在ajax()方法中,对json类型的数据进行了$.param()处理if ( s.data && s.processData && typeof s.data !== "string" ) {    s.data = jQuery.param( s.data, s.traditional );}//param方法中if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {        // Serialize the form elements        jQuery.each( a, function() {            add( this.name, this.value );        });    } else {        // If traditional, encode the "old" way (the way 1.3.2 or older        // did it), otherwise encode params recursively.        for ( prefix in a ) {            buildParams( prefix, a[ prefix ], traditional, add );        }    }
找到原因之后就好办啦
首先,traditional为false,我们可以通过设置traditional 为true阻止深度序列化
先写一个数组转为对象的方法:
Array.prototype.serializeObject = function (lName) {        var o = {};        $t = this;        for (var i = 0; i < $t.length; i++) {            for (var item in $t[i]) {                o[lName + '[' + i + '].' + item.toString()] = $t[i][item].toString();            }        }        return o;    };
$.ajax({            url: '/Home/UserAdd',            data: $.param(arr1.serializeObject("list1")) + "&" + $.param(arr2.serializeObject("list2")),            success: function (msg) {                if (msg == '1') {                    console.log('添加成功');                } else {                    console.log('添加失败');                }            }        });
C#后台接收代码
public string UserAdd(List
list1, List
list2){ return "1";}public class User{   public string Name { get; set; }   public int Age { get; set; }}

这样一来问题就解决啦!

转载于:https://my.oschina.net/webxiaohua/blog/405214

你可能感兴趣的文章
Dubbo的总体架构
查看>>
Spring Cloud微服务架构代码结构详细讲解
查看>>
以太经典硬分叉:矿工欢喜、投资者欢庆、社区高兴的“三赢”之举
查看>>
我的友情链接
查看>>
LVS启(禁)用成员
查看>>
innobackupex 备份报错
查看>>
2016 IT 运维工作计划及学习
查看>>
将一个数的二进制位模式从左到右翻转并输出
查看>>
jQuery学习之jQuery Ajax用法详解
查看>>
关于JEPLUS软件介绍——JEPLUS软件快速开发平台
查看>>
动态增加UIView到当前视图中
查看>>
怎么能看透信封
查看>>
css正方形照片墙
查看>>
找工作的程序员必懂的Linux
查看>>
shell脚本实现杨辉三角形
查看>>
ComponentOne 2019V1火热来袭!全面支持 Visual Studio 2019
查看>>
装了一款系统优化工具,如何从Mac上卸载MacBooster 7?
查看>>
使用符号表调试release程序
查看>>
Delphi 设置系统默认打印机
查看>>
AliOS Things网络适配框架 - SAL
查看>>