content-disposition不会导致另存为

Nic*_*son 4 asp.net-mvc jquery fiddler

我有以下代码:

Response.ClearContent();
Response.AddHeader( "Content-type", "application/vnd.ms-excel");
Response.AddHeader("content-disposition", "attachment;filename=test.xls");
Response.ContentType = "application/excel";
var swr = new StringWriter();
var tw = new HtmlTextWriter(swr);
grd.RenderControl(tw);
Response.Write(swr.ToString());
Response.Flush();
Response.End();
tw.Close();
swr.Close();
Run Code Online (Sandbox Code Playgroud)

此操作由以下jquery代码触发:

   <img src="../../../../Content/images/Excel-icon.png" 
      onclick = "alert ($('#Filter').serialize());
                    $.ajax({
                         type: 'POST',
                         url: '<%=Url.Action( "Excel") %>',
                         data: $('#Filter').serialize(),
                         success : function (data, textStatus, jqXHR) 
                              { alert (data);},
                         error: function (jqXHR, textStatus, errorThrown)
                              { alert (textStatus + ' ' + errorThrown);}
                         });" />
Run Code Online (Sandbox Code Playgroud)

我已经向fiddler确认标头具有预期值.我还可以使用Web View查看fiddler中的数据.

此外,当我显示成功函数中的数据内容时,它具有我尝试导出到Excel的表的原始html.

在此先感谢您的帮助.

Dar*_*rov 5

哦,不,你不能使用AJAX下载文件.执行AJAX调用,将文件流式传输到客户端,执行成功回调并传递文件的内容,这样您就会陷入困境.出于明显的安全原因,您无法对此数据做多少工作.您无法将其保存到客户端计算机.您无法在此阶段显示"另存为"提示.

因此,删除您的JavaScript AJAX调用并使用正常的GET或POST请求调用您的控制器操作.