我的使用案例:
MVC中需要在视图中提交一个数组到控制器,由于提交的数据比较复杂 还需要js处理 ,所以只能用js提交。
数组内容,以如下的形式获取后,保存到一个数组中。
var text = $("#form_pr").serializeArray(); if (thisnum < arrpanel.length) { arrpanel.splice(thisnum, 1, text); } else { arrpanel.push(text); }数组的内容打印出来是这样的:
格式如下:[[{"name": "XX","value": "XX"}, {"name": "XX","value": "XX"}, {"name": "XX","value": "XX"}],[{"name": "XX","value": "XX"}, {"name": "XX","value": "XX"}, {"name": "XX","value": "XX"}]]使用ajax提交到控制器
$.ajax({ url: "@Url.Action("ExtendField")", type: "POST", dataType: "json", traditional: true, data: { form: arrpanel, Type: $.trim($("#EFTable").val()) }, success: function (data) { } })需要注意的是,在提交数组时,需要将先将使用JSON.stringify将集合转成json字符串,否则在控制器中显示的则是:
?在使用JSON.stringify转换时,不能直接JSON.stringify(数组)否则显示出现的是这样的:
将集合合在了一起
所以需要循环转换:
$.each(arrpanel, function (index, item) {arr.push(JSON.stringify(item));}}提交数据就正常了:
转成对象直接使用时会报错:无法将带 [] 的索引应用于“object”类型的表达式,所以需要转载中使用的方式,将json转为实体对象
下附在项目中用到的完整代码:
$.each(arrpanel, function (index, item) { arr.push(JSON.stringify(item)); }); $.ajax({ url: "@Url.Action("ExtendField")", type: "POST", dataType: "json", traditional: true, data: { form: arr , Type: $.trim($("#EFTable").val()) }, success: function (data) { } }) [HttpPost] public JsonResult ExtendField(List<string> form,string Type) { int SortNO = new BLL.ExtendFieldBll().GetSortNO(); for (int index = 0; index < form.Count; index++) { Object obj = JsonConvert.DeserializeObject(form[index]); Newtonsoft.Json.Linq.JArray jarray = obj as Newtonsoft.Json.Linq.JArray;//把上面的obj转换为 Jobject对象 Model.ExtendField model = new ExtendField(); for (int i = 0; i < jarray.Count; i++) { string listdata = jarray[i].ToString(); Object obj1 = JsonConvert.DeserializeObject(listdata); Newtonsoft.Json.Linq.JObject js = obj1 as Newtonsoft.Json.Linq.JObject;//把上面的obj转换为 Jobject对象 string name = js["name"].ToString(); string value = js["value"].ToString(); if (name.Equals("InputWay")) model.InputWay = value; else if (name.Equals("Name")) model.Name = value; else if (name.Equals("Description")) model.Description = value; else if (name.Equals("TextLength")) model.TextLength = value == "" ? 50 : Convert.ToInt32(value); · · · } } }?