Ajax发送POST请求后端Controller收不到数据,移除Image字段后正常
问题诱因
- 你直接将
Uint8Array类型的文件字节数组存入对象后执行JSON.stringify序列化,得到的会是按索引排列的键值对结构(如{"0":123,"1":45,...})而非连续字节串,会导致序列化后的JSON体积比原始文件大3~4倍。 - 你当前使用默认的
application/x-www-form-urlencoded格式提交请求,ASP.NET对表单参数的默认长度限制一般为4MB以内,超大参数会被服务端直接拦截丢弃,导致dataToSend接收为空。 - 即便参数长度符合要求,
Uint8Array序列化后的结构也无法和后端Product类的Image字段匹配,反序列化也会失败。
解决方案
方案1:最小改动适配现有逻辑
- 前端将字节数组转为Base64字符串后再存入参数,新增Base64转换方法:
function arrayBufferToBase64(buffer) { let binary = ''; const bytes = new Uint8Array(buffer); for (let i = 0; i < bytes.byteLength; i++) { binary += String.fromCharCode(bytes[i]); } return window.btoa(binary); }
修改文件读取逻辑直接返回Base64:
async function getAsBase64(file) { return arrayBufferToBase64(await readFile(file)) } // 赋值Image字段时改用返回的Base64 item["Image"] = await getAsBase64(txtImage);
- 调整ASP.NET请求长度限制,在
web.config中添加配置:
<system.web> <!-- 单位KB,设置为10240即10MB,可按需调整 --> <httpRuntime maxRequestLength="10240" /> </system.web> <system.webServer> <security> <requestFiltering> <!-- 单位字节,对应10MB --> <requestLimits maxAllowedContentLength="10485760" /> </requestFiltering> </security> </system.web>
- 后端
Product类的Image字段改为string类型,需要存字节数组时调用Convert.FromBase64String转换即可。
方案2:更规范的JSON请求模式(推荐)
- 前端调整Ajax请求配置,直接提交JSON作为请求体:
$.ajax({ url: "/Admin/SaveProductToDB", type: "POST", contentType: "application/json;charset=utf-8", data: jsonString, // 直接传序列化后的JSON字符串,不需要包裹为dataToSend对象 success: function (data) { // 原有成功逻辑保持不变 } });
- 后端接口添加
[FromBody]注解,框架自动完成反序列化,不需要手动解析:
public JsonResult SaveProductToDB([FromBody] List<Product> dataToSend) { // 直接使用dataToSend即可,无需手动调用JsonConvert反序列化 }
同样需要完成方案1中的Base64转换和请求长度配置。
内容的提问来源于stack exchange,提问作者Gonzo Gonzales
相关产品推荐
相关产品推荐

