2016-01-13 51 views
1

我有以下方法ExportarIntervalos在控制器「MetasComisionesController」如何返回一個Excel文件上按一下按鈕使用jQuery和ASP.NET MVC4下載

[HttpPost] 
    public ActionResult ExportarIntervalos() 
    { 
     var products = new System.Data.DataTable("teste"); 
     products.Columns.Add("col1", typeof(int)); 
     products.Columns.Add("col2", typeof(string)); 

     products.Rows.Add(1, "product 1"); 
     products.Rows.Add(2, "product 2"); 
     products.Rows.Add(3, "product 3"); 
     products.Rows.Add(4, "product 4"); 
     products.Rows.Add(5, "product 5"); 
     products.Rows.Add(6, "product 6"); 
     products.Rows.Add(7, "product 7"); 


     var grid = new GridView(); 
     grid.DataSource = products; 
     grid.DataBind(); 

     Response.ClearContent(); 
     Response.Buffer = true; 
     Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls"); 
     Response.ContentType = "application/ms-excel"; 

     Response.Charset = ""; 
     StringWriter sw = new StringWriter(); 
     HtmlTextWriter htw = new HtmlTextWriter(sw); 

     grid.RenderControl(htw); 

     Response.Output.Write(sw.ToString()); 
     Response.Flush(); 
     Response.End(); 

     return View("ExportacionExcel"); 
    } 

我已經javascript代碼如下:

function btnExportar() { 


    var r = confirm("Desea exportar todos los Intervalos de Comision ?"); 

    if (r == true) { 
     //window.alert("Iniciar Exportacion"); 

     $.post("@Url.Action("ExportarIntervalos")",{}, 

      function (data) { 
       alert("La EXPORTACION TERMINO"); 
       window.location = "/MetasComisiones/" + "ExportacionExcel"; 
      }); 


    } else { 
     window.alert("Exportacion CANCELADA"); 
    } 
} 

這是從一個按鈕onclick事件稱爲

<button type="button" class="btn" name="btnExportar" onclick="btnExportar()">Exportar</button> 

如何更改以前的任何組件或邏輯以使按鈕btnExportar返回必須作爲響應的一部分下載的文件?我並不需要重定向到新位置

回答

2

而不是寫入響應然後返回視圖,只需返回文件響應。通常這對於一個實際的文件系統文件或者至少一個流是微不足道的,但是對於你的字符串來說也不是很難。

也許是這樣的:

var fileContent = sw.ToString(); 
var fileBytes = Encoding.UTF8.GetBytes(fileContent); 
var result = new FileContentResult(fileBytes, "application/ms-excel"); 
result.FileDownloadName = "MyExcelFile.xls"; 

return result; 

一個額外的好處在這裏是通過刪除Response引用,只是返回結果,可以更有效的單元測試,這種方法爲好。


問題然而是客戶端的代碼。除非最近有什麼變化,否則AJAX不能用於下載文件。您可以下載數據(因爲客戶端回調函數中的data變量將包含響應),但據我所知,沒有辦法(除了ActiveX對象之外,您真的不想使用它)提示用戶將該響應保存爲文件。

不過,好消息是文件響應不會在瀏覽器中卸載頁面內容。所以你並不需要真正使用AJAX本身,只需將用戶引導至文件請求。 (或者,如果瀏覽器配置爲視圖文件內容,而不是提示保存它,引導用戶在新標籤/窗口。)

由於沒有數據實際上被張貼,只是做一個正常的重定向:

window.location = '@Url.Action("ExportarIntervalos")'; 

(記住從控制器動作中刪除[HttpPost]屬性,因爲這將是一個GET請求,如果您需要使用POST那麼你可能想要把一個隱藏的表單上。你的頁面,然後在代碼中調用.submit()。)

相關問題