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”。
郎朗坤
隔江千里
浮云间
繁华开满天机
MM们
慕的地10843
阿晨1998
慕哥9229398