2015-06-30 57 views
0

这里是我的控制器代码:是否可以使用ajax.beginform下载文件?或ajax?

[HttpPost] 
    public async Task<ActionResult> DownloadItemList(int subcampaignId, string SheetName, string filename) 
    { 

     DataSet ds = new DataSet(); 

     string url = string.Format("api/report/subcampaign/{0}", subcampaignId); 

     var response = await req.GetXMLAsync(url); 
     XmlDocument xmlDoc = new XmlDocument(); 
     try 
     { 
      if (response.IsSuccessStatusCode) 
      { 
       var content = await response.Content.ReadAsStringAsync(); 

       xmlDoc.PreserveWhitespace = true; 

       xmlDoc.LoadXml(content); 

       XmlNodeReader xmlReader = new XmlNodeReader(xmlDoc); 

       ds.ReadXml(xmlReader); 


      } 


      IDataTableToWorkbookUtility workbookExportUtility = new DataTableToWorkbookUtility(); 

      byte[] excelContent = workbookExportUtility 
      .ExportDataTableToWorkbook(ds.Tables[0], SheetName) 
      .GetBytes(); 

      return this.File(excelContent, "application/vnd.ms-excel", filename + ".xls"); 
     } 
     catch (Exception e) 
     { 
      log.Debug("CampaignListController/GetAudio: " + e.Message); 
      throw; 
     } 
    } 

当我使用ajax.beginform ..而不是下载文件,响应阅读文本。我想用阿贾克斯,因为我想显示一个加载栏,当使用点击提交按钮..我想要做的是显示加载状态,同时等待文件被下载

回答

0

其实你不能上传或通过AJAX下载文件。

你可以试试下面的scenerio

如果文件被成功找到/创建。通过指向文件的链接发送JSON结果。然后在JavaScript中使用windows.location来检索文件。当出现错误时,JSON结果将包含错误信息,并且该信息可以显示给用户。为此,您需要创建另一个可以流式传输文件的端点(操作)。

$.ajax({ 
    .. 
    success: function(data) 
    { 
     if(data.result=='success'){ 
     window.open(download_path + data.fileName); 
     }   
    } 
    .. 
    }) 
+0

嗨,我可以在哪里得到“dowload_path”?你能更详细地告诉我吗?谢谢! – kxko

0

其实你可以,你需要使用blueimp的文件上传的jQuery plugin。它有一个巨大的选择和支持跨域。

它也有一个你可以实现的加载栏。

相关问题