You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:03:31