【问题标题】:Send file to client after AJAX responseAJAX 响应后向客户端发送文件
【发布时间】:2019-10-09 20:33:23
【问题描述】:

我有一个控制器操作来使用从客户端通过 AJAX 发送的过滤数据创建一个 DataTable,它本身可以正常工作:

[HttpPost]
public JsonResult RetrieveStaffData(FilterModel jsonData)
{
    var data = (from i in db.StaffList
                where i.Username.Contains(jsonData.Username)
                    && i.Surname.Contains(jsonData.Surname)
                    && i.Forename.Contains(jsonData.Forename)
                    // etc...
                orderby i.Surname ascending)
                .ToList();

    if (data == null)
        return Json(new { success = "False", message = "filter brought back no results" });

    DataExport(ToDataTable(data));

    return Json(new { success = "True", message = "data retreival successful" });
}

我还有一个现有的 DataExport 控制器操作,它将 DataTable 转换为 excel 文档并将其发送到客户端以供下载,它本身也可以正常工作:

public void DataExport(DataTable dt)
{
    Response.Clear();
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("content-disposition", "attachment;filename=spreadsheetname.xlsx");

    using (var p = new ExcelPackage())
    {
        var ws = p.Workbook.Worksheets.Add("StaffList");
        ws.Cells.LoadFromDataTable(dt, true);
        ws.Cells.AutoFitColumns();

        var ms = new System.IO.MemoryStream();
        p.SaveAs(ms);
        ms.WriteTo(Response.OutputStream);
    }

    Response.OutputStream.Flush();
    Response.OutputStream.Close();
    Response.End();
}

问题在于,当在 return 之前调用 DataExport 操作时,文件作为 AJAX 响应而不是文件下载发送到客户端,在响应中显示为乱码二进制文件。

如何向客户端发送响应消息,然后发送文件以供下载? Async/Await 在这里有帮助吗?我想我可以在 JS 中使用 Blob 来处理文件客户端,但只是想知道是否有更好的方法。

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: c# asp.net asp.net-mvc


    【解决方案1】:

    您必须让客户端发出辅助请求,而不是通过 ajax - 您无法通过 ajax 下载文件。使用诸如 window.open 之类的东西,定向到运行导出方法的下载操作方法的 URL。

    我不知道您是如何编写 ajax 请求的,但在指示成功响应的回调中,请执行以下操作:

    window.open(@Url.Action("DownloadData"));
    

    查看您的代码,您也可能根本不需要 ajax 请求 - 它似乎返回的只是“是/否”类型的响应。也许页面应该直接打开“下载”操作的窗口,这将运行查询,然后运行 ​​DataExport 函数。

    【讨论】:

    • 目前我有你说的live版本,它打开窗口并下载文件。但它会下载整个表格,而不是我想要实现的过滤结果。在开发版本中,过滤器现在是通过 POST 发送的,我应该将其作为查询字符串发送吗?
    • 如果不是太多数据,那么你可以。或者您可以从您的主页进行回发,我认为这可能会奏效。
    • 干杯,这很好用。我想我只是把事情复杂化了。
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2014-03-01
    相关资源
    最近更新 更多