MVC ajax不下载文件

本文关键字:文件 下载 ajax MVC | 更新日期: 2023-09-27 18:17:41

这是调用控制器的ajax调用

 @using(Html.BeginForm("ExportData", "ViewData", FormMethod.Post,
     new {
         id = "myform", name = "myform"
     })) {

     <button type = "submit"> Export Raw Policy </button>
 }

 <div id = "divProcessing"> <img src = ~/assets/layouts/layout3/img/loading-spinner-blue.gif" > </p> </div>

 @section Scripts {
     @Scripts.Render("~/bundles/jqueryval")
     <script type = "text/javascript" >
         $(document)
         .ready(function() {
             // Hide the "busy" Gif at load:
             $("#divProcessing").hide();
             // Handle the form submit event, and make the Ajax request:
             $("#myform")
                 .on("submit",
                     function(event) {
                         event.preventDefault();
                         // Show the "busy" Gif:
                         $("#divProcessing").show();
                         var url = $(this).attr("action");
                         var formData = $(this).serialize();
                         $.ajax({
                             url: url,
                             type: "POST",
                             data: formData,
                             dataType: "json",
                             contentType: 'application/json; charset=utf-8',
                             success: function(resp) {
                                 // Hide the "busy" gif:
                                 $("#divProcessing").hide();
                                 // Do something useful with the data:
                                 $("<h3></h3>")
                                     .appendTo("#divResult");
                             }
                         })
                     });
         }); </script>
 }

这个方法正在将数据表导出到excel

  public static void ExportToExcel(DataTable table)
        {
            try
            {
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.ClearContent();
                HttpContext.Current.Response.ClearHeaders();
                HttpContext.Current.Response.Buffer = true;
                HttpContext.Current.Response.ContentType = "application/ms-excel";
                HttpContext.Current.Response.Write(@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">");
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=Reports.xls");
                HttpContext.Current.Response.Charset = "utf-8";
                HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
                //sets font
                HttpContext.Current.Response.Write("<font style='font-size:10.0pt; font-family:Calibri;'>");
                HttpContext.Current.Response.Write("<BR><BR><BR>");
                //sets the table border, cell spacing, border color, font of the text, background, foreground, font height
                HttpContext.Current.Response.Write("<Table border='1' bgColor='#ffffff' " +
                                                   "borderColor='#000000' cellSpacing='0' cellPadding='0' " +
                                                   "style='font-size:11.0pt; font-family:Calibri; background:white;'> <TR>");
                //am getting my grid's column headers
                int columnscount = table.Columns.Count;
                for (int j = 0; j < columnscount; j++)
                {
                    //write in new column
                    HttpContext.Current.Response.Write("<Td>");
                    //Get column headers  and make it as bold in excel columns
                    HttpContext.Current.Response.Write("<B>");
                    HttpContext.Current.Response.Write(table.Columns[j].ToString());
                    HttpContext.Current.Response.Write("</B>");
                    HttpContext.Current.Response.Write("</Td>");
                }
                HttpContext.Current.Response.Write("</TR>");
                foreach (DataRow row in table.Rows)
                {
//write in new row
                    HttpContext.Current.Response.Write("<TR>");
                    for (int i = 0; i < table.Columns.Count; i++)
                    {
                        HttpContext.Current.Response.Write("<Td>");
                        HttpContext.Current.Response.Write(HttpContext.Current.Server.HtmlEncode(row[i].ToString()));
                        HttpContext.Current.Response.Write("</Td>");
                    }
                    HttpContext.Current.Response.Write("</TR>");
                }
                HttpContext.Current.Response.Write("</Table>");
                HttpContext.Current.Response.Write("</font>");
                HttpContext.Current.Response.Flush();
                HttpContext.Current.Response.End();
            }
            catch (Exception ex)
            {
                string abc = ex.ToString();
            }
        }

这是我的控制器

 public ActionResult ExportData()
        {
            var industryData = _rawDataHlper.GetIndustryData();
            if (industryData != null)
            {
                ExportToExcel((industryData));
            }
            return RedirectToAction("Index");
        }

上面的代码正在进行ajax调用并调用控制器。控制器正在将datatable下载到excel中。

如果我调用控制器没有ajax调用,那么它将下载excel文件,但当我使ajax调用,然后它不下载excel文件。

代码调用了正确的控制器和动作,但是没有下载文件。

谁能告诉我这里出了什么问题?没有ajax也可以。

如有任何帮助,不胜感激。

MVC ajax不下载文件

在ajax调用中,如果你返回一个url到资源,将该url附加到下载链接并触发下载开始的点击,那就再好不过了

从c#返回一个链接

return LinkToAction("Index");// don't know the syntax here sorry

在success函数中创建一个链接

 success: function(resp) {
  $('body').append('<a  class="hidden-download" href="'+resp+'" download>hidden<a>').trigger('click').hide();//append it to the body, trigger the click then hide/remove the link