使用Ajax MVC下载excel文件

时间:2016-02-24 17:22:39

标签: asp.net-mvc-5

如何在MVC中使用Ajax下载文件。如果没有数据生成文件则显示错误标签。 我正在尝试使用返回File的动作结果方法。我可以下载文件。但如果没有要下载的文件,则不想刷新页面。 我的代码就像

public ActionResult Excel(MyViewModel model)

{

    var result = // DB call to get data

    if (no data)
    {
        return **something**
    }
    else
    {
        byte[] excelContent =//passing result to my method( returns xls file in byte)

        return File(
                    excelContent, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                    reportName + " Report " + startDate + " - " + endDate + ".xlsx");
    }
}

我应该为某事返回什么 现在我正在为某事返回emptyResult,因此如果没有数据,我会得到空白页。 Ajax不支持文件下载。 如果我提交表单并且有数据,则此代码有效。 建议哪些页面不会刷新并完成任务。 1.如果数据文件下载 2.如果没有数据,则显示错误标签

3 个答案:

答案 0 :(得分:0)

  1. 如果使用Ajax获取文件,那么最好的方法是创建API
  2. 函数返回类型为FileResult

    var exportToExcel = function (inputData, fileName) {
    var path = "url";
    var form = $("<form></form>");
    form.attr("enctype", "application/x-www-form-urlencoded");
    form.attr("method", "post");
    form.attr("action", path);
    form.attr("accept-charset", "UTF-8");
    
    var field = $("<input></input>");
    field.attr("type", "hidden");
    field.attr("name", "data");
    field.attr("value", escape(JSON.stringify(inputData)));
    
    form.append(field);
    var field2 = $("<input></input>");
    
    field2.attr("name", "fileName");
    field2.attr("value", fileName);
    form.append(field2);
    $(document.body).append(form);
    form.submit().remove();
    

    };

    var downloadFile = function(inputData){         // checkFileHasResult是ajax调用结果,如果为true或false         checkFileHasResult(inputData).then(function(hasFile){             if(hasFile === true){                 //给出带扩展名的文件名                 exportToExcel(inputData,&#34; asdfasdf.csv&#34;);             }         });     };

答案 1 :(得分:0)

在Google中进行快速搜索,提出了不少结果,this提问。

在JQuery中,您可以将“window.location”指向控制器中的action方法,该方法返回FileResult。这将为您下载文件。

我建议您将消息返回到ajax调用,说明您的下载是否成功,然后您可以在前端设置某种文本以通知用户此过程不成功。

以下是我将如何完成这项工作。你可以调整它以适合你。以下是控制器方法的示例。

[HttpGet]
public JsonResult ExportCollection()
{
    //Build your excel file, and save it to disk somewhere on server.
    //you can also save it in session, depending on size
    //Build up response Messages based on success or not

    //return json object with your file path
    return Json(new { responseMessage = responseMessage }, JsonRequestBehavior.AllowGet);
}

public ActionResult Download(string fileName)
{
    return File(model.FilePath, "application/vnd.ms-excel", fileName);
}

然后,使用JQuery和Ajax调用从客户端调用这些操作。

 $(document).on("click", "#YourButton", function () {
        var url = "/YourController/ExportCollection/"

        $("#responseText").text("We're getting things ready. Please wait...");
        $('#loadingImage').show();

        $.ajax({
            url: url,
            type: "get",
            success: function (responseMessage) {
                patientCollectionExportSuccess(responseMessage);
            }
        });
    })

//Function responsible for exporting
function patientCollectionExportSuccess(dataReceived) {
    var respMessage = dataReceived.responseMessage;

    if (respMessage != null) {
        if (respMessage != "Error: Not Exported.") {

            $("#responseText").text("Download completed.");
            $('#loadingImage').hide();

            //set window.location to redirect to FileResult, which will download file
            window.location = '/PatientListingQuery/Download?fileName=' + respMessage ;
        }
        else {
            $("#responseText").text("Download unsuccessful.");
            $('#loadingImage').hide();

            $("#responseText").text(dataReceived.responseMessage);
        }

    }
}

答案 2 :(得分:0)

谢谢你们

我得到了解决方案 它对我很有帮助....

我的表单操作指向另一个方法,因此在提交表单之前更新了操作。在文件下载后,我将其设置为旧表单操作。

$(document).ready(function () {
    $('#excel-button').on('click', function () {            
        $.ajax({
            url: '/MyController/IsData',
            type: 'POST',
            data: $("#myForm").serialize(),
            success: function (response) { 
                if (response == "True") {
                    var oldUrl="";
                    var form1 = $('#myForm');

                    var frm = document.getElementById('myForm') || null;
                    if (frm) {
                          oldUrl = frm.action; 
                        frm.action = '/MyController/GenerateExcel';
                    }

                    form1.submit(); 
                    frm.action = oldUrl; 
                    $('.error-Message').hide(); 

                }                    else {                         

                    $('.error-Message').show(); 

                }
            }
    });
    });