Angular传递含对象数组的FormData到.NET Core C# API时Items为空如何解决
解决方案
核心原因
.NET Core 对[FromForm]标记的复杂类型参数做模型绑定时,要求数组类属性的键名必须遵循数组属性名[索引].子属性名的命名规则,不符合规则的键名会导致后端无法解析数组内容。
正确的Angular端构造代码
// 假设你前端已经拿到了要提交的数组、文件、基础参数 const submitItems = [ { Type: '身份背调', Result: '无异常' }, { Type: '学历背调', Result: '信息匹配' } ]; const resultPdfFile = /* 你选择的ResultPdf文件对象 */; const disclosurePdfFile = /* 你选择的DisclosurePdf文件对象 */; const empId = /* 员工Guid值 */; const completeDate = new Date(); // 构造FormData const formData = new FormData(); // 基础参数正常追加 formData.append('EmpId', empId); formData.append('CompleteDate', completeDate.toISOString()); // 文件正常追加 formData.append('ResultPdf', resultPdfFile); formData.append('DisclosurePdf', disclosurePdfFile); // 重点:按索引追加数组每个元素的属性 submitItems.forEach((item, index) => { formData.append(`Items[${index}].Type`, item.Type); formData.append(`Items[${index}].Result`, item.Result); }); // 发送请求,不要手动设置Content-Type请求头,让浏览器自动生成带边界值的multipart/form-data头 this.http.post('你的API接口地址', formData).subscribe(res => { // 处理响应 });
注意事项
- 数组索引必须从0开始连续递增,不能出现跳号,否则中断位置之后的元素都会被模型绑定忽略
- 键名需要和后端类的属性名对应,.NET Core默认不区分键名大小写,
Items[0].type和Items[0].Type都可以正常识别 - 不要将整个数组序列化为JSON字符串后赋值给
Items键,这种写法后端无法解析为数组对象
内容的提问来源于stack exchange,提问作者Faisal
相关产品推荐
相关产品推荐

