2010-03-22 64 views
1

我正在返回由表單發佈事件觸發的操作的文件結果。 我無法獲得下載對話框。相反,如果我使用:沒有與FileResult的下載對話框

return File(Encoding.UTF8.GetBytes(reportPath), "text/plain", "Report.csv"); 

我在目標div中獲得執行ajax時文件的路徑。

當我使用

return File(reportPath, "text/plain", "Report.csv"); 

我得到目標DIV文件的內容。作爲

[HttpPost] 
    public virtual ActionResult ExportFilter(Model model) { 
     string outputFile = CreateReport(model); 
     return File(....) 
    } 

的形式通過Ajax.BeginForm(...)submited

動作聲明。更

編輯

有點信息:我的形式有2個提交按鈕。一個用於在目標div中顯示結果,另一個用於導出結果。該actton是相同的,我用它來確定哪個按鈕觸發事件:

 [HttpPost] 
     public virtual ActionResult Run(model) 
     { 
      var bExecute = !string.IsNullOrEmpty(Request.Form["execute"]); 
      return bExecute ? Execute(model) : Export(model); 
     } 

     [HttpPost] 
     public virtual ActionResult Execute(model) 
     { 
      .... 
      return PartialView("Report", model); 
     } 

     [HttpPost] 
     public virtual FileResult Export(model) { 
       ..... 
       return File(....) 
     } 

一些答案後,我試圖使用重定向到獲取行動:

.... 
    return RedirectToAction(MVC.Report.OfferDownload(ReportFile)); 
} 

    [HttpGet] 
    public virtual FileResult OfferDownload(string FileName) 
    { 
     return File(FileName, "text/csv", "Report.csv"); 
    } 

然而,這並沒有幫助。

我也嘗試過Stream文件,但它也沒有幫助。

EDIT2

肯定阿賈克斯問題,因爲當我與Html.BeginForm取代Ajax.BeginForm它的工作原理。我想到的一個解決方案是使用提交按鈕上的onclick事件來更改表單屬性。

+0

我認爲主要問題是AJAX提交 - 請參閱我的更新答案。 – tvanfosson 2010-03-22 19:26:46

+0

您應該在POST請求後重定向用戶,並讓該方法提供該文件。郵政/重定向/獲取。您還應該明確地將您的操作方法的返回類型設置爲FileResult。 – 2010-03-22 19:36:07

+0

我確實嘗試過,看我的編輯。 – majkinetor 2010-03-23 10:50:19

回答

1

打開位於服務器上提供的路徑上的文件並讀取其內容。以FileResult的形式發送內容。另外,如果您期待下載,請勿通過AJAX提交表單。該響應將發送到AJAX代碼,我不認爲瀏覽器會攔截它並給你一個文件下載對話框。這實際上可能是整個問題(在這種情況下,你的第二個樣本可能會工作)。

string outputFile = CreateReport(model); 
using (var stream = new StreamReader(outputFile)) 
{ 
    return File(stream, "text/csv", "Report.csv"); 
} 

編輯:FWIW,我會使用 「文本/ CSV」 或 「應用程序/ CSV」 爲CSV文件。

+0

不通過Ajax提交表單不適合我。你看,形式佈置在這樣的方式,它有2個提交按鈕 - 通過AJAX 1顯示的結果目標DIV,並導致另外一個出口 – majkinetor 2010-03-23 10:49:58

+0

什麼,我可能會做的是有出口按鈕做一個單擊處理正常提交(非AJAX),另一個按鈕做一個AJAX提交。我甚至可能會爲出口單獨採取行動。事實上,當我這樣做時,我通常會有一個操作來處​​理任何過濾器參數並將過濾器參數存儲在會話中。這就是過濾器上的「表單」 - 它通過AJAX發佈並更新顯示。導出成爲此時的簡單鏈接,並使用過濾器參數(或默認值)來獲取適當的數據並將其作爲文件發送出去。 – tvanfosson 2010-03-23 11:17:37

+0

謝謝。這看起來是一個很好的方法。 – majkinetor 2010-03-23 11:44:12

0

對於任何新來過這個問題的人:在POST方法中重定向到GET將不起作用。您可以保留您的Ajax POST,並在其成功後可以通過FileResult GET操作方法執行GET服務以供下載文件。

$.ajax({ 
    url: '@Url.Action("ExportFilter")', 
    type: 'POST', 
    cache: false, 
    async: true, 
    success: function (data) { 
      window.location.replace(urlOfferDownload + "?FileName=" + data.FileName); 
    } 
});