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

通过Ajax POST向Web API传递含嵌套对象列表的实体失败,求解决

问题分析与解决方案

核心问题

  1. 文件无法通过JSON传递:IFormFile是二进制文件类型,JSON仅支持文本数据,必须使用multipart/form-data格式上传。
  2. 前端数据格式错误:
    • 错误将嵌套列表转为JSON字符串传递,后端期望的是List<NestedClass>对象列表而非字符串。
    • 属性名后多了空格(如"StdType "),与后端实体类属性名不匹配,导致模型绑定失败。
  3. 请求内容类型不匹配:上传文件需用multipart/form-data,而非application/json。

解决方案

后端代码(无需修改,保持原逻辑)

ASP.NET Core默认支持multipart/form-data格式的模型绑定,控制器和实体类可保留原样:

[HttpPost("SaveDocuments")]
public IActionResult SaveDocuments(Documenttest saveDocs)
{
    var docTypeList = docContext.SaveDocuments(saveDocs);
    return Ok(docTypeList);
}

public class Documenttest
{
    public int Id { get; set; }
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
    public string? Gender { get; set; }
    public List<NestedClass>? oNestedClass { get; set; } = new();
}

public class NestedClass
{
    public string? StdType { get; set; }
    public IFormFile? StdFile { get; set; }
}

前端JS代码修改(改用FormData上传)

$("#postform").submit(function (e) {
    e.preventDefault();
    
    var apiurl = "https://localhost:7168/api/NestClass/SaveDocuments";
    var fileUpload = $(".uplFile");
    var formData = new FormData();

    // 添加基础表单字段
    formData.append("FirstName", $("#txtFirstName").val());
    formData.append("LastName", $("#txtLastName").val());
    formData.append("Gender", $("#txtGender").val());

    // 遍历文件控件,添加嵌套列表数据
    for (var i = 0; i < fileUpload.length; i++) {
        var files = fileUpload[i];
        if (files.files.length > 0) {
            // 用索引格式指定嵌套对象,属性名与后端完全一致(无空格)
            formData.append(`oNestedClass[${i}].StdType`, i.toString());
            formData.append(`oNestedClass[${i}].StdFile`, files.files[0]);
        }
    }

    $.ajax({
        type: 'POST',
        url: apiurl,
        data: formData,
        contentType: false, // 禁用自动设置Content-Type,由jQuery处理multipart边界
        processData: false, // 禁止jQuery处理FormData,保持原始格式
        success: function (d) {
            alert("Saved Successfully");
        },
        error: function (xhr, status, error) {
            console.error(error);
            alert("Error please try again");
        }
    });
});

关键注意点

  • FormData格式:这是上传文件的标准方式,同时支持文本字段和二进制文件。
  • 嵌套列表绑定格式:oNestedClass[索引].属性名是ASP.NET Core识别嵌套集合的标准语法。
  • 禁用数据处理:必须设置contentType: false和processData: false,否则jQuery会破坏FormData的结构。

内容的提问来源于stack exchange,提问作者mahesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:45:41