2017-05-17 24 views
0
public ActionResult Index(int id, string name) 
    { 
     var model = new ITViewModel 
     { 
      Packages = _Repository.GetDeployedPackages(id) 
     }; 
     return View(model); 
    } 

[HttpPost] 
public ActionResult GeneratePackage(ITViewModel model) 
    { 
    _Repository.SavePackage(model); 

    //Generate Zip file Package 
    //Get file template in archiveStream 
      Response.Clear(); 
      Response.ContentType = "application/zip"; 
      Response.AppendHeader("content-disposition", "attachment; filename="testzipPackage"); 
      Response.CacheControl = "Private"; 
      Response.Cache.SetExpires(DateTime.Now.AddMinutes(3)); 
      Response.Buffer = true; 
      var writeBuffer = new byte[4096]; 

      var count = archiveStream.Read(writeBuffer, 0, writeBuffer.Length); 
      while (count > 0) 
      { 
       Response.OutputStream.Write(writeBuffer, 0, count); 
       count = archiveStream.Read(writeBuffer, 0, writeBuffer.Length); 

      } 
    model.Packages = _Repository.GetDeployedPackages(model.id) //get the correct package list with the one tht we just saved on this ActionResult 

    return View("Index",model); 
    } 

    //Index 
    @model ITViewModel 
    @using (Html.BeginForm("GeneratePackage", "Integration", FormMethod.Post) 
{ 
    //some input form 
} 

<table> 
@foreach (var package in Model.Packages) 
      { 
<tr> 
<td> 
     @package.Name 
</td> 
</tr> 
} 
</table> 

我能夠正確下載zip文件。在調試器中,我還會看到帶有新添加元素的Package列表。但郵政觀點沒有得到刷新。我的意思是索引上的表格不會使用新的模型元素進行刷新。即使document.ready沒有被調用一次 返回View(「Index」,model)被觸發。剃刀視圖上的模型沒有得到表單提交更新

I have tried ModelState.Clear(). It didn't work. 
+2

您不能一次執行兩個HTTP響應。內容是'text/html'(用於視圖)或'application/zip'(用於下載),但不能同時爲兩者。您將需要做其他事情,例如返回視圖,然後通過javascript啓動下載。 –

+0

@PaulAbbott wat是爲此而工作的?我需要用戶下載壓縮文件。但我也希望他們看到更新的列表..我可以強制頁面在sedning zip後刷新 – Scorpio

+0

解決方法是返回視圖,然後通過JavaScript啓動下載。您需要製作第二個控制器操作,下載文件並通過JavaScript調用該操作。您無法先下載,然後刷新頁面,因爲下載只是文件傳輸,在下載完成後無法包含「說明」以執行其他任何操作。 –

回答

1

您無法從單個HTTP請求返回兩個不同的響應。

這裏你正在寫的迴應:你以後做

Response.OutputStream.Write(writeBuffer, 0, count); 

任何沒有被服務器或客戶端處理。

您的網絡瀏覽器正在下載文件,而不僅僅停留在同一頁面上。這是絕對正常的。

如果你想刷新頁面,你可能需要使用JavaScript客戶端來完成。

這是使用jQuery假設myForm爲您的表格ID的一個小例子:

$('#myForm').submit(function() { 
    setTimeout(function() { 
     window.location.reload(); 
    }, 1000); // use a timeout as big as you need 
}); 

你也可能需要添加target="_blank"到您的表單標籤。

+0

我試過在文檔準備好,但它只是沒有調用提交索引頁上的任何腳本..我如何強制頁面刷新文件下載? – Scorpio

+0

在窗體提交上附加刷新邏輯,[像這樣](http://stackoverflow.com/questions/18920651/how-can-i-refresh-a-form-page-after-the-form-submits-to-空白)*或*反轉你的邏輯,並返回一個視圖,並鏈接到你要下載的文件(正如Paul Abbott所建議的那樣)。 –

+0

是否建議$('#myForm')。submit(function(){ location.reload(); }綁定提交事件?很抱歉打擾一下,你能用一個小的JS代碼更新你的答案嗎? – Scorpio