2012-11-15 56 views
1

下面是我的控制器中的代碼片段...它都從我的索引開始。ASP.net MVC 3不會下載生成的文件

public ActionResult Index(...){ 
     //some code here 
     return GenerateReport(...); 
    } 

到目前爲止... exporter.GenerateReport()返回生成excel文件的正確路徑...

public ActionResult GenerateReport(...){ 
     string pathOfGeneratedFile = exporter.GenerateReport(...); 
     return DownloadFile(pathOfGeneratedFile, "application/vnd.ms-excel"); 
} 


public FileResult DownloadFile(string filePath, string contentType = "application/octet-stream"){ 
     return File(filePath, contentType, Path.GetFileName(filePath)); 
} 

實際上有沒有錯誤/異常一路上發生了...... 。但我期待,我可以下載文件一旦生成...我手動打開使用OpenXMl生成的文件,它確實打開,所有的信息都存儲在那裏...

這是我的看法.. 。我用我的按鈕的值做了一些解析,以反映GenerateReport用戶操作。 ...這將提交給索引操作它決定了用戶操作,如果單擊生成按鈕...

<input class="btn btn-primary pull-right" type="submit" value="Generate Report" name="userAction"/> 

編輯:我用這個也是我認爲...

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "recordList", InsertionMode = InsertionMode.Replace })) 

順便說一句,一旦所有的操作完成...我可以看到我的視圖中的垃圾值。我只是想要下載文件。謝謝。

+0

你是否有機會使用AJAX表單? –

+0

我編輯它... thx – JYR

回答

2

無法下載文件的原因是您正在使用AJAX異步請求。 AJAX響應不能包含文件下載。你可以嘗試這樣的事情在你的控制器:

public ActionResult Index(...) { 
    var fileName = GenerateReport(); 

    // store the file name somewhere on the server - do NOT pass it through the URL. 
    this.TempData["DownloadFileName"] = fileName; 
    this.TempData["DownloadContentType"] = "application/vnd.ms-excel"; 
    this.TempData.Keep("DownloadFileName"); 
    this.TempData.Keep("DownloadContentType"); 

    return new JavaScriptResult() { Script = "document.location = \"" + this.Url.Action("Download") + "\";" }; 
} 

public ActionResult Download() { 
    return File((string)this.TempData["DownloadFileName"], (string)this.TempData["DownloadContentType"], Path.GetFileName(filePath)); 
} 

所以,你的AJAX請求會導致重定向(不能使用RedirectToAction,因爲這會導致瀏覽器的AJAX請求重定向內)。此重定向將指示瀏覽器以傳統請求下載文件。

+0

即時通訊有點困惑...誰調用Download()?它仍然是GenerateReport()? – JYR

+0

也JavaScriptResult不包含一個構造函數作爲什麼IDE說... – JYR

+0

修改了答案修復錯誤,並描述會發生什麼 –