Asp.net mvc 5 使用Ajax MVC下载excel文件

Asp.net mvc 5 使用Ajax MVC下载excel文件,asp.net-mvc-5,Asp.net Mvc 5,如何在MVC中使用Ajax下载文件。如果没有数据生成文件,则显示错误标签。 我正在尝试使用返回文件的操作结果方法。我可以下载文件。但如果没有可下载的文件,则不希望刷新页面。 我的代码是 public ActionResult Excel(MyViewModel model) { var result = // DB call to get data if (no data) { return **something** } else

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

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.如果没有数据,则显示错误标签

  • 如果使用Ajax获取文件,则是创建API的最佳方法
  • 函数返回类型为
    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 exportToExcel=函数(输入数据,文件名){
    var path=“url”;
    变量形式=$(“”);
    form.attr(“enctype”,“application/x-www-form-urlencoded”);
    表格attr(“方法”、“职位”);
    form.attr(“动作”,路径);
    表格attr(“接受字符集”、“UTF-8”);
    变量字段=$(“”);
    字段属性(“类型”、“隐藏”);
    字段属性(“名称”、“数据”);
    field.attr(“value”,转义(JSON.stringify(inputData));
    表单追加(字段);
    变量字段2=$(“”);
    字段2.attr(“名称”、“文件名”);
    field2.attr(“值”,文件名);
    表格。附加(字段2);
    $(document.body).append(表单);
    form.submit().remove();
    
    })

    var downloadFile=函数(inputData){ //如果为true或false,则checkFileHasResult是ajax调用结果 checkFileHasResult(inputData)。然后(函数(hasFile){ 如果(hasFile==true){ //提供扩展名为的文件名 exportToExcel(输入数据,“asdfasdf.csv”); } }); };

  • 如果使用Ajax获取文件,则是创建API的最佳方法
  • 函数返回类型为
    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 exportToExcel=函数(输入数据,文件名){
    var path=“url”;
    变量形式=$(“”);
    form.attr(“enctype”,“application/x-www-form-urlencoded”);
    表格attr(“方法”、“职位”);
    form.attr(“动作”,路径);
    表格attr(“接受字符集”、“UTF-8”);
    变量字段=$(“”);
    字段属性(“类型”、“隐藏”);
    字段属性(“名称”、“数据”);
    field.attr(“value”,转义(JSON.stringify(inputData));
    表单追加(字段);
    变量字段2=$(“”);
    字段2.attr(“名称”、“文件名”);
    field2.attr(“值”,文件名);
    表格。附加(字段2);
    $(document.body).append(表单);
    form.submit().remove();
    
    })

    var downloadFile=函数(inputData){ //如果为true或false,则checkFileHasResult是ajax调用结果 checkFileHasResult(inputData)。然后(函数(hasFile){ 如果(hasFile==true){ //提供扩展名为的文件名 exportToExcel(输入数据,“asdfasdf.csv”); } }); };


  • 在谷歌上做一个快速搜索,得到了不少结果

    在JQuery中,您可以将“window.location”指向控制器中的操作方法,该方法返回一个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);
            }
    
        }
    }
    

    在谷歌上做一个快速搜索,得到了不少结果

    在JQuery中,您可以将“window.location”指向控制器中的操作方法,该方法返回一个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);
            }
    
        }
    }
    
    谢谢各位

    我找到了解决办法 这对我来说很顺利

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

    $(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(); 
    
                    }
                }
        });
        });
    
    谢谢各位

    我找到了解决办法 这对我来说很顺利

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

    $(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(); 
    
                    }
                }
        });
        });
    

    是否有其他方法代替保存文件?例如,您可以将文件保存在TempData中。但是,当用户出于任何原因刷新页面时,我相信该文件会消失。保存到磁盘可能更好,下载后,您可以再次从磁盘删除该文件。是否有其他方法代替保存文件?例如,您可以将文件保存到TempData中。但是,当用户出于任何原因刷新页面时,我相信该文件会消失。保存到磁盘可能更好,下载后,您可以再次从磁盘删除该文件。