Excel文件无法在MVC4中使用AJAX下载

时间:2015-11-28 21:49:47

标签: javascript c# ajax asp.net-mvc asp.net-mvc-4

我正在研究MVC4应用程序,并尝试使用RDLC报告创建Excel文件。以下是我编写的用于调用控制器方法的AJAX代码。

var actionUrl = '@Url.Action("MethodName", "ControllerName")';
 $.ajax(actionUrl, {
        type: 'POST',
        data: { merchantAlias: merchantName2, merchantName: merchantName1, sDate: date1, eDate: date2, Incident: whichIncident, call: whichcall },
        success: function (d) {
           alert(d);
           alert("success1");
       }
});

我尝试调试应用程序并验证控制器方法是否正确调用并返回File。它还显示了"成功"警告消息,但是在视图中文件没有下载。

我尝试使用超链接进行类似的操作,并将硬编码参数发送到方法,然后下载文件。以下是代码:

<div><a href="@Url.Action("MethodName", new { merchantAlias = "someAlias", merchantName = "someName", sDate = "2015-01-01 00:00:00", eDate = "2015-01-01 00:10:00", Incident = "0", call = 1 })"> Get Report Excel</a></div>

但是我需要根据用户在视图上做出的选择将动态参数传递给我的方法。

以下是Controller Method:

中编写的代码
        LocalReport lr = new LocalReport();
        lr.ReportPath = Path.Combine(Server.MapPath("~/Reports"), "MerchantExcelReport.rdlc");
        DataTable dt = GetDataForExcel(merchantAlias, merchantName, sDate, eDate, Incident, call);
        ReportDataSource rd = new ReportDataSource("MerchantExcelDataSet", dt);
        lr.DataSources.Add(rd);
        string reportType = "Excel", mimeType, encoding, fileNameExtension;

        string deviceInfo =
        "<DeviceInfo>" +
        "  <OutputFormat>" + reportType + "</OutputFormat>" +
        "  <PageWidth>8.5in</PageWidth>" +
        "  <PageHeight>11in</PageHeight>" +
        "  <MarginTop>0.5in</MarginTop>" +
        "  <MarginLeft>1in</MarginLeft>" +
        "  <MarginRight>1in</MarginRight>" +
        "  <MarginBottom>0.5in</MarginBottom>" +
        "</DeviceInfo>";

        Warning[] warnings;
        string[] streams;
        byte[] renderedBytes;

        renderedBytes = lr.Render(reportType, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings);
        return File(renderedBytes, mimeType);

2 个答案:

答案 0 :(得分:3)

使用ajax,您无法下载可以使用的文件

window.location = 'your url';

或者使用可以使用

jQuery File Download plugin下载文件你需要做的是从你的控制器和ajax调用成功返回文件路径

var actionUrl = '@Url.Action("MethodName", "ControllerName")';
 $.ajax(actionUrl, {
        type: 'POST',
        data: { merchantAlias: merchantName2, merchantName: merchantName1, sDate: date1, eDate: date2, Incident: whichIncident, call: whichcall },
        success: function (d) {

           $.fileDownload(yourfilepath);
       }
});

答案 1 :(得分:0)

您无法使浏览器提示使用ajax下载文件。您必须将文件存储在服务器上的某个位置,然后必须使用文件路径设置window.location。

或者如果你想使用流而不是存储文件,只需将你的代码的url放回文件而不是任何ajax请求和你的查询字符串参数。