为了账号安全,请及时绑定邮箱和手机立即绑定

mvc中使用ajax传递json数组老是失败。

mvc中使用ajax传递json数组老是失败。

神不在的星期二 2018-12-06 18:17:59
function updateItemsQtys() { var postData; var postArr = []; var index = 0; $("#[id^='Qty-']").each(function () { itemElementId = $(this).attr('id'); var productId = 0; productId = itemElementId.replace("Qty-", ""); postArr[index] = { ProductId: productId, Qty: $(this).val() }; index++; }); postData = { Items: postArr }; var jsonData = JSON.stringify(postData); alert(jsonData); //$.post('@Html.Resolve("Basket/UpdateItems")', jsonData, updateBasket, "json"); $.ajax({ url: '@Html.Resolve("Basket/UpdateItems")', type: 'POST', data: jsonData, dataType: 'json', contentType: 'application/json', success: updateBasket }); } 这是js代码,传递的json数据基本上是这样的: {"Items" : "[{"ProductId" : "4", "Qty" : "5"}, {"ProductId" : "2", "Qty" : "2"}]"} c#解析json数据的代码: public class JsonModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if (controllerContext == null) throw new ArgumentNullException("controllerContext"); if (bindingContext == null) throw new ArgumentNullException("bindingContext"); var serializer = new DataContractJsonSerializer(bindingContext.ModelType); return serializer.ReadObject(controllerContext.HttpContext.Request.InputStream); } } 把json解析成的类型: [DataContract] [ModelBinder(typeof(JsonModelBinder))] public class JsonBasketQtyUpdateRequest { [DataMember] public JsonBasketItemUpdateRequest[] Items { get; set; } } [DataContract] [ModelBinder(typeof(JsonModelBinder))] public class JsonBasketItemUpdateRequest { [DataMember] public int ProductId { get; set; } [DataMember] public int Qty { get; set; } } 提交到action的定义: [HttpPost] public JsonResult UpdateItems(JsonBasketQtyUpdateRequest jsonBasketQtyUpdateRequest) 不明白为什么老是解析失败,提示错误:应为来自命名空间“”的元素“root”。。遇到名称为“”、命名空间为“”的“None”。
查看完整描述

8 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

貌似JSON的格式有点问题,应该是这样写吧

{"Items" : [{"ProductId" : "4", "Qty" : "5"}, {"ProductId" : "2", "Qty" : "2"}]}

查看完整回答
反对 回复 2019-01-21
?
隔江千里

TA贡献1906条经验 获得超10个赞

JSON部分只传 

[{"ProductId" : "4", "Qty" : "5"}, {"ProductId" : "2", "Qty" : "2"}]

试试

查看完整回答
反对 回复 2019-01-21
?
浮云间

TA贡献1829条经验 获得超4个赞

还是不行,同样的错误

查看完整回答
反对 回复 2019-01-21
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

使用FIDDLER2跟踪下传递的数据内容。

查看完整回答
反对 回复 2019-01-21
?
MM们

TA贡献1886条经验 获得超2个赞

传递的数据内容就是{"Items" : "[{"ProductId" : "4", "Qty" : "5"}, {"ProductId" : "2", "Qty" : "2"}]"},基本上就是这样了

查看完整回答
反对 回复 2019-01-21
?
慕的地10843

TA贡献1785条经验 获得超8个赞

@浩GE: 其实不用那么麻烦的,直接传递你这个json字符串,MVC就会自动解析的。

在Basket/UpdateItems的这个方法中这样使用, public ActionResult UpdataItems(List<Product> items){}

在前台传递时,$.ajax()方法中需要把traditional设置为 true   , traditional的作用和  JSON.stringify(postData)的作用是一样的。traditional,目的是为了得到:
Values=1&Values=2&Values=3;否则的话,将会得到:
Values[]=1&Values[]=2&Values[]=3
那么MVC就不认识了。

查看完整回答
反对 回复 2019-01-21
?
阿晨1998

TA贡献2037条经验 获得超6个赞

坑爹的,我特意试了一下你这个代码。

发现JSON格式没有问题,后来还尝试了换一种序列化方式也没有问题,

问题在[ModelBinder(typeof(JsonModelBinder))]这句,你把2个都去掉以后试试。时间太晚了,没仔细查为什么。

我测试的Json是这个{"Items":[{"ProductId":1,"Qty":2},{"ProductId":3,"Qty":4},{"ProductId":5,"Qty":6}]}

简化了你的jQuery代码,直接提交了上面的Json。

查看完整回答
反对 回复 2019-01-21
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

非常感谢!不过的确是出错在json格式上,因为我的页面上的一个js文件和json2.js有冲突,导致JSON.stringify函数格式化数组的时候多了2个引号,我把那个js文件去了就没问题了。

查看完整回答
反对 回复 2019-01-21
  • 8 回答
  • 0 关注
  • 481 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信