ajax传递数组参数如何避免数组为空时报错

toMatser 2016-06-14 08:21:56
我用ajax传递数组参数,
代码如下:
$.ajax({
url: Spica_Module + "/purchase/item/editItemAndUnits",
traditional: true,
type: "post",
dataType: "json",
async:false,
data: {
id: id,
quantity:quantity,
shelves:shelves,
packageUnits:packageUnits

},
success: function (data) {

},
error: function (ex) {
//alert("ajax请求错误!");
}
});
其中shelves和packageUnits是数组,定义如下:
var arr=[];
var shelve=[];

$(this).closest("td").siblings("td").find(".packQuantity").each(function(){
arr.push((($(this).val()=="")?"0":$(this).val())+"-"+$(this).attr("data-pack-id"));
});
$(this).closest("td").siblings("td").find(".itemEdit").each(function(){
shelve.push($(this).find(".iquantity").data("quantity")+"-"+$(this).find(".iunit").data("unit")+"-"+$(this).find(".ishelve").data("shelve"));
});
意思就是循环dom节点,有值的话向数组中push,正常有值的话我的ajax请求没有报错,
后台接收代码:
@ResponseBody
@RequestMapping(value = {"/item/editItemAndUnits"}, method = {RequestMethod.GET,RequestMethod.POST})
public Boolean editItemAndUnits(@RequestParam("id") String id,
@RequestParam("quantity") String quantity,
@RequestParam("shelves") String[] shelves,
@RequestParam("packageUnits") String[] packageUnits,
Subject subject,Model model){。。。。}
问题是:
当我参数数组都有值的时候,请求正常访问,但是当我的数组参数为空,即:
var arr=[];
var shelve=[];
的时候ajax请求就报错,报错如下:
"NetworkError: 400 Bad Request - http://localhost:9980/erp/purchase/item/editItemAndUnits"
之前只有一个数组参数的时候我写了两个ajax,一个有改参数,一个没有该参数,现在有两个都可为空的数组参数,所以不能这么写了,求大神帮忙解决一下
...全文
777 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
toMatser 2016-06-16
  • 打赏
  • 举报
回复
楼上是正解,果然是,ajax传递的ajax参数data,如果某个数组参数为空的话,默认就被舍弃,这样的话ajax发送的参数跟后台java接收参数就对应不上了,这样就会报400的错误,在后台可以有两种处理方法,(我用的是springmvc) 一种是: @RequestParam(value="shelves", required=false) String[] shelves, 设置该参数为required=false,这样的话默认会设置这个数组参数为null,然后判断一下就行 第二种是: 用域模型接收,设一个类, @ModelAttribute("form") SupplyCriteria criteria, 其实这两种是一样性质的,都是在后端设置数组默认值null
toMatser 2016-06-15
  • 打赏
  • 举报
回复
网上说的是: dataType: "json", traditional:true:数据类型必须是json。 默认的话,traditional为false,即jquery会深度序列化参数对象, 也许是在深度序列化的时候数组对象为空,报错了?应该有方法避免的? 到底是哪个方法呢
toMatser 2016-06-15
  • 打赏
  • 举报
回复
将数组转为字符串格式,当成普通参数,传到后台之后不用@RequestParam("shelves") String[] shelves,而是用@RequestParam("shelves") String shelves接收,然后再用String[] shelvesarr=shelves.split(",");接收,以前就用这种方法,这种方法ajax不再用traditional: true属性,这个方法是可以的,只是我当时觉得直接传递数组简单一些吧,而且有值的话也能传递成功,还是想知道传递数组的时候怎么处理空值异常
回首笑浮生 2016-06-15
  • 打赏
  • 举报
回复
改成string类型传递估计就没问题了。arr.join(',') 再到服务端判断非空字符串转数组。
  • 打赏
  • 举报
回复
和这个配置无关,是应为数据为数组的时候,如果数组没有内容,这个参数不会出现,就是参数被舍弃了,所以导致无法获取到对应的参数,不懂java,自己看下是否有配置默认参数值什么的功能
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.2.min.js"></script>
<script>
    jQuery.ajaxSettings.traditional = false
    var a = { a: [], b: [1, 2] };
    console.log($.param(a))//b%5B%5D=1&b%5B%5D=2  ==>b[]=1&b[]=2
    jQuery.ajaxSettings.traditional = true
    console.log($.param(a))//b=1&b=2
</script>

52,792

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧