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

如何通过Ajax将jsPDF生成的文件与模型一同发送至控制器?

解决方案:通过Ajax同时提交jsPDF生成的PDF与模型数据到ASP.NET Core控制器

核心问题说明

你之前的写法错误在于用表单序列化(urlencoded格式)和Blob直接拼接,这种方式无法正确传递文件数据。正确的做法是使用FormData对象,它专门用于处理包含文件的表单数据,能同时兼容普通模型字段和文件上传。


前端实现步骤与代码

  1. 生成jsPDF的Blob对象
  2. 创建FormData,添加模型字段和PDF文件
  3. 配置Ajax请求(关键是禁用自动处理数据和Content-Type)
// 1. 生成jsPDF并导出为Blob
const doc = new jsPDF();
doc.text("报表内容示例", 15, 15);
const pdfBlob = doc.output('blob'); // 生成PDF的Blob对象

// 2. 构建FormData,同时添加模型数据和PDF文件
const formData = new FormData();
// 遍历表单元素,把模型字段加入FormData(假设表单id为reportForm)
$("#reportForm").serializeArray().forEach(item => {
    formData.append(item.name, item.value);
});
// 添加PDF文件,注意键名要和后端模型的IFormFile属性名完全一致
formData.append("ReportPdf", pdfBlob, "generated-report.pdf");

// 3. 发送Ajax请求
$.ajax({
    url: "/YourController/EditReport",
    method: "POST",
    data: formData,
    contentType: false, // 必须设为false,让浏览器自动设置multipart/form-data边界
    processData: false, // 必须设为false,禁止jQuery处理FormData格式
    success: function(res) {
        console.log("提交成功:", res);
        // 后续逻辑,比如页面跳转或提示
    },
    error: function(xhr) {
        console.error("提交失败:", xhr.responseText);
    }
});

后端实现步骤与代码

  1. 调整模型,添加IFormFile类型的属性(对应前端的PDF文件)
  2. 编写控制器Action,接收模型参数

模型定义

public class PartialReportModel
{
    // 你的原有模型字段,示例:
    public int ReportId { get; set; }
    public string ReportTitle { get; set; }
    public DateTime ReportDate { get; set; }

    // 对应前端传递的PDF文件,键名必须和FormData中的一致
    public IFormFile ReportPdf { get; set; }
}

控制器Action

public class YourController : Controller
{
    [HttpPost]
    public IActionResult EditReport(PartialReportModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        // 处理模型数据
        var reportId = model.ReportId;
        var reportTitle = model.ReportTitle;

        // 处理PDF文件
        if (model.ReportPdf != null && model.ReportPdf.Length > 0)
        {
            // 示例:读取PDF字节流
            using var memoryStream = new MemoryStream();
            model.ReportPdf.CopyTo(memoryStream);
            byte[] pdfBytes = memoryStream.ToArray();
            
            // 后续逻辑:保存到服务器、存储到数据库等
        }

        return Ok("报表更新成功");
    }
}

关键注意事项

  • 前端FormData的键名必须和后端模型的属性名完全匹配(大小写不敏感,但建议保持一致)
  • 必须设置contentType: false和processData: false,否则jQuery会破坏FormData的格式,导致文件无法识别
  • 可以在浏览器开发者工具的Network面板中查看请求,确认FormData是否包含了文件和所有模型字段

内容的提问来源于stack exchange,提问作者tachidow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:01:08