【问题标题】:How to download an excel File and PDF file using Jquery Ajax MVC如何使用 Jquery Ajax MVC 下载 excel 文件和 PDF 文件
【发布时间】:2014-12-30 02:04:49
【问题描述】:

我正在使用 MVC 应用程序。我想使用 Jquery AJAX 下载 excel 文件和 PDF 文件。

在查看页面中

 <a href="javascript:void(0)" class="excelbtn" data-is-pdf="false" >Export To Excel</a>
 <a href="javascript:void(0)" class="pdfbtn" data-is-pdf="true">Export To PDF</a>

jQuery ajax

$.ajax({
        type: 'GET',
        url: '/Report/ExportReports',
        contentType:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        data: {
            Parameter1: Parameter1,
            Parameter2: Parameter2,
        },
        cache: false,
        success: function (isSuccess) {
            if (isSuccess.Success) {
                }
            } else {
                alert('Something went wrong. Please try again after sometime...');
            }
        },
        error: function (data, status, e) {
        }
    });

在控制器中

public ActionResult ExportReports(string Parameter1, string Parameter2)
    {
       if (Parameter1 = "PDF")
        {
            DataTable exportData = grid.GetExportData(dataSource);
            MemoryStream pdfStream = gridData.ExportToPDF(exportData, repType);

            Response.ClearContent();
            Response.ClearHeaders();
            Response.ContentType = "application/pdf";
            Response.AppendHeader("Content-Disposition", "attachment; filename=" + executeRepType + ".pdf");
            Response.BinaryWrite(pdfStream.ToArray());
            Response.End();
        }
        else
        {
            DataTable exportData = grid.GetExportData(dataSource);
            MemoryStream excelStream = gridData.ExportToExcel(exportData, executeRepType);
            //Write it back to the client
            Response.ClearContent();
            Response.ClearHeaders();
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("content-disposition", "attachment;  filename=" + executeRepType + ".xlsx");
            Response.BinaryWrite(excelStream.ToArray());//.GetAsByteArray());
            Response.End();
        }
        return View();
    }

所以在控制器中我们正在获取所有数据,但我们无法返回查看页面。

【问题讨论】:

  • 为什么需要 ajax?

标签: jquery ajax asp.net-mvc-4 download


【解决方案1】:

我建议您借助开箱即用的工具使事情变得更简单。 System.Web.MVC.Controller.File 为您提供了一种方法,该方法将使用字节数组或流或文件路径完全满足您的需求。所以代替这部分(对于pdf也是如此)

Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;  filename=" + executeRepType + ".xlsx");
Response.BinaryWrite(excelStream.ToArray());//.GetAsByteArray());
Response.End();

我会用这样的东西

File(excelStream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Octet, executeRepType + ".xlsx");

并且异步请求中没有实际需要。所以你可以使用直接链接。

【讨论】:

  • 我正在使用类似的东西,但是在此之后如何更新视图(或刷新页面)?出于某种原因,即使没有Response.End(),在我写入文件后页面也会停止处理。
  • 根据您使用的前端有几种解决方案。经典的方法是将@Ajax.ActionLinkOnSuccess AjaxOption 一起使用,您可以在其中设置javascript 函数,该函数将在控制器成功处理您的请求后执行。作为替代方案,您可以使用 @Html.ActionLink 并为其指定 id 或 class attr,例如@Html.ActionLink("LinkText","Action",null, new {@id="file"}) 并使用 jQuery 捕捉点击,从代码 $('#file').click(function(){$.post(this.href..)}) 发布
【解决方案2】:

您可以尝试此解决方案。 在查看页面中

@Html.ActionLink("Export To Excel", "ExportReports", new { isPdfExport = false,Parameter1="_Parameter1" ,Parameter2="_Parameter2"}, new { @class="excelbtn" })

@Html.ActionLink("Export To PDF", "ExportReports", new { isPdfExport = true,Parameter1="_Parameter1" ,Parameter2="_Parameter2"}, new { @class="pdfbtn" })

如果您想动态更改 parameter1 和 parameter2 的值,则可以使用下面描述的 javascript

在 Javascript 中:-

$('.excelbtn').attr('href', function () {
        return this.href.replace('_Parameter1', Value1).replace('_Parameter2',Value2);
          });
$('.pdfbtn').attr('href', function () {
        return this.href.replace('_Parameter1', Value1).replace('_Parameter2',Value2);
          });

在控制器中:-

public ActionResult ExportReports(bool isPdfExport,string Parameter1, string Parameter2)
{
   if (Parameter1 = "PDF")
    {
        DataTable exportData = grid.GetExportData(dataSource);
        MemoryStream pdfStream = gridData.ExportToPDF(exportData, repType);

        Response.ClearContent();
        Response.ClearHeaders();
        Response.ContentType = "application/pdf";
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + executeRepType + ".pdf");
        Response.BinaryWrite(pdfStream.ToArray());
        Response.End();
    }
    else
    {
        DataTable exportData = grid.GetExportData(dataSource);
        MemoryStream excelStream = gridData.ExportToExcel(exportData, executeRepType);
        //Write it back to the client
        Response.ClearContent();
        Response.ClearHeaders();
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("content-disposition", "attachment;  filename=" + executeRepType + ".xlsx");
        Response.BinaryWrite(excelStream.ToArray());//.GetAsByteArray());
        Response.End();
    }
    return View();
}

【讨论】:

    猜你喜欢
    • 2022-10-12
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2013-05-16
    相关资源
    最近更新 更多