2017-05-25 153 views
0

我在過濾數據表的頁面上有過濾器。如何使用ajax window.location下載文件

還有一個獨立的按鈕,用於導出數據爲excel。

我按照這個例子:Download Excel file via AJAX MVC

當點擊了出口按鈕jQuery的讀取所有的過濾器值並把結果作爲以下傳遞迴服務器:

$.ajax({ 
     url: url, 
     type: 'POST', 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: filterData 
    }).done(function (returnData) { 
     if (returnData.success) { 
      window.location = returnData.locationUrl;   
     }  
    }); 

在我有2個服務器動作

[HttpPost] 
    public ActionResult ExportTo(SearchVm searchVm) 
    { 

     var data = _service.GetSearchTerm(searchVm).Take(150).ToList(); 

     string handle = Guid.NewGuid().ToString(); 
     TempData[handle] = data; 
     var fileName = $"C-{handle}.xlsx"; 
     var locationUrl = Url.Action("Download", new { fileGuid = handle, fileName }); 

     var downloadUrl = Url.Action("Download"); 
     return Json(new { success = true, locationUrl, guid = handle, downloadUrl }, JsonRequestBehavior.AllowGet); 

    } 

    [HttpGet] 
    public ActionResult Download(string fileGuid, string fileName) 
    { 
     if (TempData[fileGuid] != null) 
     { 
      var fileNameSafe = $"C-{fileGuid}.xlsx"; 
      var data = TempData[fileGuid] as List<Company>; 

      using (MemoryStream ms = new MemoryStream()) 
      { 
       GridViewExtension.WriteXlsx(GetGridSettings(fileNameSafe), data, ms); 
       MVCxSpreadsheet mySpreadsheet = new MVCxSpreadsheet(); 
       ms.Position = 0; 
       mySpreadsheet.Open("myDoc", DocumentFormat.Xlsx,() => 
       { 
        return ms; 
       }); 
       byte[] result = mySpreadsheet.SaveCopy(DocumentFormat.Xlsx); 
       DocumentManager.CloseDocument("myDoc"); 
       Response.Clear(); 
       Response.ContentType = "application/force-download"; 
       Response.AddHeader("content-disposition", $"attachment; filename={fileNameSafe}"); 
       Response.BinaryWrite(result); 
       Response.End(); 
      } 
      } 
      return new EmptyResult(); 
     } 

上面的代碼工作正常,下載本地計算機上的文件。但是,當我在服務器上生效時,導出按鈕單擊會將用戶指向URL而不是下載文件。

我不明白爲什麼會發生這種情況。該應用程序託管在Azure Web服務上。我能看到的地方和生產之間唯一的區別是生產有ssl。

window.location是否有任何限制?爲什麼它會強制瀏覽器在本地機器上下載文件,但它會將用戶重定向到生產環節?

我檢查了鉻控制檯,沒有錯誤。

任何想法爲什麼?

感謝,

+0

您是否嘗試過'window.location.href'? –

+0

是的,我試了兩個和window.open(url,'_blank');以及。但仍然在我的本地工作正常,但在服務器上它將用戶導向到URL而不是下載文件。 – akd

回答

0

-return文件名和fileGuid到你的Ajax方法和連接動作網址,而不是在後端創建它,並調用下載操作。

- 改變返回的數據:

[HttpPost] 
    public ActionResult ExportTo(SearchVm searchVm) 
    { 
     var data = _service.GetSearchTerm(searchVm).Take(150).ToList(); 
     var handle = Guid.NewGuid().ToString(); 
     TempData[handle] = data; 
     var fileName = $"C-{handle}.xlsx"; 
     /// var locationUrl = Url.Action("Download", new { fileGuid = handle, fileName }); 
     // var downloadUrl = Url.Action("Download"); 
     return Json(new { success = true, guid = handle, fileName=fileName }, JsonRequestBehavior.AllowGet); 
    } 

- 改變AJAX實現功能:

$.ajax({ 
    url: url, 
    type: 'POST', 
    dataType: 'json', 
    contentType: 'application/json; charset=utf-8', 
    data: filterData 
}).done(function (returnData) { 
     if (returnData.success) 
     { 
      window.open('/download/' +returnData.guid + '/' + returnData.fileName, '_blank', ''); 
     } 
    });