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

使用Fetch API传递数组时控制器接收值为Null的问题解决

问题分析与解决方案

你的问题核心在于请求体结构不匹配和Guid类型绑定失败,导致ASP.NET Core无法完成模型绑定,最终控制器接收到null。

核心问题点

  1. 请求结构不对应:前端传递的是包裹在folderFiles属性里的JSON对象,但控制器直接期望接收List<TmfZipFolderFiles>数组,两者结构不匹配,模型绑定直接失败。
  2. 空字符串无法转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:42:50