通过Ajax POST向Web API传递含嵌套对象列表的实体失败,求解决
问题分析与解决方案
核心问题
- 文件无法通过JSON传递:
IFormFile是二进制文件类型,JSON仅支持文本数据,必须使用multipart/form-data格式上传。 - 前端数据格式错误:
- 错误将嵌套列表转为JSON字符串传递,后端期望的是
List<NestedClass>对象列表而非字符串。 - 属性名后多了空格(如
"StdType "),与后端实体类属性名不匹配,导致模型绑定失败。
- 错误将嵌套列表转为JSON字符串传递,后端期望的是
- 请求内容类型不匹配:上传文件需用
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
相关产品推荐
相关产品推荐

