C# 用ajax在MVC中导出

C# 用ajax在MVC中导出,c#,jquery,ajax,asp.net-mvc,C#,Jquery,Ajax,Asp.net Mvc,我正在尝试通过ajax导出控制器中创建的zip文件。我已经研究了几个相关的问题,但它们都略有不同,我无法将这些点联系起来。有时,我得不到任何回报。其他时候,我的ajax会转到窗口位置,一切都会中断 我的ajax调用: $.ajax({ url: "/Somewhere/Export", type: "POST", dataType: 'html', data: { jsonModel: JSON.stringify(modelData),

我正在尝试通过ajax导出控制器中创建的zip文件。我已经研究了几个相关的问题,但它们都略有不同,我无法将这些点联系起来。有时,我得不到任何回报。其他时候,我的ajax会转到窗口位置,一切都会中断

我的ajax调用:

$.ajax({
     url: "/Somewhere/Export",
     type: "POST",
     dataType: 'html',
     data: {
         jsonModel: JSON.stringify(modelData),
         fileType: $("#toggle-2").val()
      },
      success: function (returnValue) {
           window.location = '/Somewhere/Export/Download?file=' + returnValue;
      },
});
我的控制器一次尝试剪断:

[HttpPost, Authorize]
public ActionResult Export(string jsonModel, int? fileType)
{
    MemoryStream workingStream = GenerateExportFile(jsonModel, fileType);
    return File(workingStream, "application/zip", folderName + ".zip");
}
我还尝试使用响应流:

[HttpPost, Authorize]
public ActionResult Export(string jsonModel, int? fileType)
{
    MemoryStream workingStream = GenerateExportFile(jsonModel, fileType);
    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment; filename=" + folderName + ".zip");
    Response.ContentType = System.Net.Mime.MediaTypeNames.Application.Zip;
    workingStream.WriteTo(Response.OutputStream);
    Response.End();
    return RedirectToAction("Index");
}
我看过的东西: , ,及 在javascript中(使用blockui和jquery文件下载插件):

在javascript中(使用blockui和jquery文件下载插件):


您的数据类型表示您正在发回html,而不是实际发回文件。然后将您的url设置为此结果。。。基本上,这一切都没有任何意义。第二种方法是返回一个re direct(同样不是zip文件)可能与ajax重复。忽略ajax,只需打开一个新窗口,在使用传统ajax并需要下载文件时返回zip文件,最好的办法是在
src
指向某个文件作为附件返回的页面中添加
iframe
。这将是跨浏览器兼容的,并且很容易测试和实现。您的数据类型表示您正在发回html,而不是实际发回文件。然后将您的url设置为此结果。。。基本上,这一切都没有任何意义。第二种方法是返回一个re direct(同样不是zip文件)可能与ajax重复。忽略ajax,只需打开一个新窗口,在使用传统ajax并需要下载文件时返回zip文件,最好的办法是在
src
指向某个文件作为附件返回的页面中添加
iframe
。这将是跨浏览器兼容的,并且易于测试和实现。
        $(window).block();
        $.fileDownload('Export', {
            httpMethod: 'POST',
            data: inputs,
            successCallback: function (url) {
                $(window).unblock();
            },
            failCallback: function (responseHtml, url) {
                $(window).unblock();
                $(window).html(url + '</br>' + responseHtml);
            }
        });
    public ActionResult Export()
    {
        var e = new ExportZip();
        var request = Request.Unvalidated;
        byte[] data = e.Create(request.Form);

        Response.SetCookie(new HttpCookie("fileDownload", "true") { Path = "/" });
        return File(data, "application/zip", "file.zip");
    }