使用Fetch API传递数组时控制器接收值为Null的问题解决
问题分析与解决方案
你的问题核心在于请求体结构不匹配和Guid类型绑定失败,导致ASP.NET Core无法完成模型绑定,最终控制器接收到null。
核心问题点
- 请求结构不对应:前端传递的是包裹在
folderFiles属性里的JSON对象,但控制器直接期望接收List<TmfZipFolderFiles>数组,两者结构不匹配,模型绑定直接失败。 - 空字符串无法转Guid:前端的
fileId是空字符串,而实体类中fileId是非可空Guid类型,空字符串无法转换为有效Guid,这会触发绑定失败,最终导致整个列表为null。
两种可行解决方案
方案一:调整前端请求,直接传递数组
修改JavaScript代码,直接序列化数组本身,同时处理空fileId(转为null适配后端可空Guid):
const url = "/TMF/DownloadFolderFilesAsZip"; // 处理空fileId,转为null适配后端可空Guid const processedFiles = foldersFiles.map(item => ({ ...item, fileId: item.fileId === '' ? null : item.fileId })); var data = { method: "POST", body: JSON.stringify(processedFiles), // 直接序列化数组,而非包裹在对象中 headers: new Headers({ 'content-type': 'application/json' }) } fetch(url, data) .then(resp => resp.blob()) .then(blob => { const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.style.display = 'none'; a.href = url; a.download = "document" + ".zip"; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); }) .catch(() => alert(''));
同时修改后端实体类,将fileId改为可空Guid(如果业务允许空值):
public class TmfZipFolderFiles { public Guid? fileId { get; set; } // 改为可空类型 public Guid folderId { get; set; } public Guid tenantId { get; set; } public Guid userId { get; set; } }
控制器代码保持不变:
[HttpPost] public async Task DownloadFolderFilesAsZip([FromBody] List<TmfZipFolderFiles> folderFiles) { // ... 你的业务逻辑 }
方案二:后端创建DTO匹配前端请求结构
如果不想修改前端代码,可以在后端新增一个DTO类,完全匹配前端传递的对象结构:
// 新增请求DTO类 public class FolderFilesRequest { public List<TmfZipFolderFiles> folderFiles { get; set; } } // 修改实体类的fileId为可空 public class TmfZipFolderFiles { public Guid? fileId { get; set; } public Guid folderId { get; set; } public Guid tenantId { get; set; } public Guid userId { get; set; } }
然后修改控制器接收这个DTO:
[HttpPost] public async Task DownloadFolderFilesAsZip([FromBody] FolderFilesRequest request) { // 从request中获取数组 var folderFiles = request.folderFiles; // ... 你的业务逻辑 }
前端代码无需修改,保持原有结构即可。
额外注意事项
- 如果前端无法提供
tenantId和userId,同样需要将这两个字段改为Guid?可空类型,否则会再次触发绑定失败。 - 确保请求头的
content-type确实是application/json,ASP.NET Core只会对该类型的请求做JSON模型绑定。
内容的提问来源于stack exchange,提问作者Batu han
相关产品推荐
相关产品推荐

