2017-08-21 29 views
1

我有一個按鈕,它通過在控制器中運行保存功能來保存表單。該控制器的形式爲:如何使用一種控制器方法返回FileResult和View

[HttpPost] 
public ActionResult Save(ViewModel model) 
{ 
    Save(model); 
    var newModel = new ViewModel(); 
    return View(Index, newModel); 
} 

,我有以下形式的DownloadFile功能

public FileResult DownloadReceipt(int reportId) 
{ 
    filebytes = CreateFile(reportid); 
    return File(filebytes, MediaTypeNames.Application.Pdf, "file name"); 
} 

我希望能夠允許用戶下載使用第二功能,同時該文件使用第一個函數將用戶重定向到索引。單擊保存按鈕時,第一個函數被調用。有沒有一種方便的方法可以使用該按鈕將文件下載到用戶計算機上,同時仍然重定向到所需的視圖。目前下載文件功能不會在任何地方被調用。

+1

您無法同時返回視圖和文件。您可以通過鏈接返回視圖以下載文件,或者通過javascript調用下載。 – DavidG

+0

在'onsuccess'內重定向? –

回答

0

控制器的操作後面有一個名爲HTTP的協議。該協議爲每個請求指定應該是單個響應。因此,在回答您的問題時,無法將多個頁面回覆(返回)到單個請求。

但冷靜下來,仍然有希望。我們可以僞造這種行爲。有很多方法來僞造它。

@if((ViewBag.ReportId as int?) > 0) 
{ 
    <script type="text/javascript"> 
     var url = "@Url.Action("DownloadReceipt", new { reportId = ViewBag.ReportId })"; 
     window.open(url, "_blank"); 
    </script> 
} 
<!-- the rest of index code --> 

如果您在頁面中把這個代碼,很快我會告訴你一個:

在你Index.cshtml你可以寫下載頁面調用:

Index.cshtml頁面加載時,它會在不關閉頁面的情況下調用第二頁(DownloadReceipt)。

要使其工作你現在需要做的是在動作設置ViewBag.ReportId

[HttpPost] 
public ActionResult Save(ViewModel model) 
{ 
    Save(model); 
    var newModel = new ViewModel(); 
    ViewBag.ReportId = 5; // Change 5 for some code that get report id. 
    return View(Index, newModel); 
} 

總之,如果ViewBag.ReportId設置索引頁將altomatically一旦它加載調用下載頁面,否則(如果沒有設置ViewBag.ReportId)將不會進行呼叫下載。

相關問題