Ajax 即使响应头中有内容,也无法下载csv文件

Ajax 即使响应头中有内容,也无法下载csv文件,ajax,asp.net-mvc,post,Ajax,Asp.net Mvc,Post,我有一个愚蠢的问题,我在响应头中看到了我的csv数据,但它没有下载csv。 在客户端,我有一个按钮,在其上单击一个ajax post请求,如下所示 $.ajax({ url: 'xyz/GenerateCSV', type: 'POST', data: postData, contentType: "application/json; charset=utf-8" }); 在服务器端,我将响应设置为 Response.AddHeader("content-dis

我有一个愚蠢的问题,我在响应头中看到了我的csv数据,但它没有下载csv。 在客户端,我有一个按钮,在其上单击一个ajax post请求,如下所示

$.ajax({
    url: 'xyz/GenerateCSV',
    type: 'POST',
    data: postData,
    contentType: "application/json; charset=utf-8"
});
在服务器端,我将响应设置为

Response.AddHeader("content-disposition", "attachment;filename=ListExport.csv");
Response.ContentType = "text/csv"; 
http响应标头正常运行,如下所示-

Cache-Control:private
content-disposition:attachment;filename=EncounterListExport.csv
Content-Encoding:gzip
Content-Type:text/csv; charset=utf-8
Date:Mon, 22 Sep 2014 14:18:05 GMT
Server:Microsoft-IIS/8.0
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:4.0
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?        
知道发生了什么吗?我没有使用任何表单或“提交”按钮

谢谢,
Vaibhav

关于您的上述评论:

它失败的原因是什么也没有发生

这有点不正确。你自己也承认,“回复内容有数据。”因此确实发生了一些事情。响应将数据发送到客户端

问题是,你如何处理这些数据?根据您的代码,没有:

$.ajax({
    url: 'xyz/GenerateCSV',
    type: 'POST',
    data: postData,
    contentType: "application/json; charset=utf-8"
});
查看
$.ajax()
。您需要为它提供一些代码,以便在收到响应后调用。该代码将以某种方式处理响应。大概是这样的:

$.ajax({
    url: 'xyz/GenerateCSV',
    type: 'POST',
    data: postData,
    contentType: "application/json; charset=utf-8"
}).done(function (response) {
    // use the data from the response
}).fail(function (response) {
    // handle an error from the response
});

如何处理这些数据取决于您自己。它是结构化的CSV数据,我想有一些JavaScript库可以很容易地解析它。如果要将数据保存到文件中,则必须以某种方式提示用户()或将其保存到本地存储。JavaScript不能直接写入文件系统(出于明显的安全原因)。

它失败的具体原因是什么?响应内容是否不包含数据?服务器端代码是否没有将数据写入响应?AJAX调用的响应处理程序是否没有看到数据或以某种方式出错?还有什么?响应内容有数据。它失败的原因是什么也没有发生。我的意思是CSV没有被下载。没有任何类型的错误。那么,您对响应做了什么?您正在进行一个AJAX调用,如何处理该调用的结果?如果这是上面的代码,那么你基本上忽略了响应。如果响应包含数据,则数据已成功下载到客户端。但是您的客户端代码对它没有任何作用。服务器端的响应被正确捕获。我可以通过浏览器的dev工具栏的“Network”选项卡看到http响应实际上正在到达客户端。那么,我还应该做些什么来下载呢?我已经在服务器端声明了以下内容-Response.AddHeader(“内容处置”,“附件;文件名=lisexport.csv”);我明白你的意思了。但在以前的情况下,我使用了一个表单来指定url(服务器端代码完全相同)。这也是一个Post请求,正在下载一个csv文件。为什么这次没有发生?@KumarVaibhav:你理解错了。正在下载。您的代码只是忽略了结果。这种情况的不同之处在于,您使用的是AJAX而不是页面级请求。在页面级请求中,浏览器的功能处理响应,并保存文件或提示用户。在AJAX请求中没有这样的默认功能。您需要手动处理响应。好的。知道了。那么这次我如何模拟浏览器响应呢?有办法吗?是的,我现在完全明白数据正在被下载,在给定的示例中,我需要处理如何处理它。@KumarVaibhav:如果您希望用户能够将其保存为文件,那么您可能希望将其作为页面级请求而不是AJAX请求。(因为这是一个下载文件的请求,浏览器不应该卸载当前页面上下文。)我链接到的另一个问题也有嵌入
iframe
的想法,并对其提出页面级请求。可能还有其他一些我不知道的选项,谷歌搜索“AJAX下载文件”可能会找到其他想法。而且效果很好。由于此回答包含了回答此问题所需的所有信息,因此我将此标记为答案!