如何在JSON对象中序列化列表?Ajax提交后模型列表为空问题
解决ASP.NET MVC中Ajax Post列表模型绑定为Null的问题
你的问题核心是当前扁平键值对格式(如B[1].Name)无法被ASP.NET MVC默认模型绑定器识别为嵌套列表对象,需要将数据转换为标准嵌套JSON结构再发送。以下是具体解决步骤:
1. 构造正确的嵌套JavaScript对象
放弃扁平键名写法,直接创建与后端模型结构匹配的嵌套对象:
// 构造符合要求的请求数据 var postData = { a: "test", B: [ { Name: "test", Surname: "testing" } // 如需添加更多列表项,直接在数组中追加对象即可 ] };
2. 正确配置Ajax请求
使用JSON.stringify()将对象序列化为JSON字符串,并设置正确请求头,确保后端能识别JSON格式:
$.ajax({ url: "/YourController/TargetAction", type: "POST", contentType: "application/json; charset=utf-8", // 必须设置此请求头 data: JSON.stringify(postData), success: function(response) { // 处理成功响应 }, error: function(xhr) { // 处理错误情况 } });
3. 确保后端模型结构匹配
后端模型类必须和前端对象结构完全对应,示例如下:
public class MainModel { public string a { get; set; } public List<SubModel> B { get; set; } } public class SubModel { public string Name { get; set; } public string Surname { get; set; } }
4. 从表单数据转换的处理方案
如果数据来自表单(表单元素name为B[0].Name这类格式),可以手动解析serializeArray()结果,重组为嵌套对象:
var formArray = $("form").serializeArray(); var postData = { B: [] }; $.each(formArray, function(i, field) { var nameSegments = field.name.split("."); if (nameSegments[0].startsWith("B[")) { // 提取列表索引和属性名 var indexMatch = nameSegments[0].match(/\[(\d+)\]/); if (indexMatch) { var idx = parseInt(indexMatch[1]); if (!postData.B[idx]) postData.B[idx] = {}; postData.B[idx][nameSegments[1]] = field.value; } } else { postData[field.name] = field.value; } }); // 之后用JSON.stringify(postData)发送请求
内容的提问来源于stack exchange,提问作者Coder3000
相关产品推荐
相关产品推荐

