2016-12-26 91 views
0

是否可以從同一控制器返回FileContentResult和PartialView?我無法讓它工作。主控制器代碼:MVC C#在返回PartialView之前從控制器返回文件

... 
var generateClass = new GenerateExcel(); // create obj of another class 
generateClass.Generate(reports); // generate .xlsx file and save it to server disk 
Download(); // ??? download file to client PC via "Save as.." dialog 

return PartialView("_PartialReport", reports); // second (main) return and the end of controller 

下載()方法在這裏:

public FileContentResult Download() 
{ 
    using (HostingEnvironment.Impersonate()) 
    { 
     byte[] doc = System.IO.File.ReadAllBytes(@"C:\temp\BLP.xlsx"); 
     // doc is OK, it's size == size of .xlsx file 
     return File(doc, "application/vnd.ms-excel"); 
    } 
} 

沒有錯誤,但不會工作。 幫助別人嗎?

更新:AJAX代碼示例

// Generate report by creation date 
function ConstructReportByDate() { 

    var date1 = $('#DateFrom').val(); 
    var date2 = $('#DateTo').val(); 

    $.ajax({ 
     url: '/Reports/ConstructReport', 
     type: "POST", 
     contentType: 'application/json; charset=utf-8', 
     cache: false, 
     data: '{"kind":"byDate", "date1":"' + date1 + '", "date2":"' + date2 + '"}' 
    }) 
    .done(function (data) { 
     $('#Report').html(data); 
    }) 
    .fail(function (xhr) { 
     alert('errorHere'); 
    }); 
} 
+0

沒有。這些是兩個不同的行動電話。 – Nkosi

+2

你想發送2個結果,所以這需要2個請求。您需要修改調用該操作的代碼以發出2個請求。 – glacasa

+0

什麼glacasa說,只需在$(document).ready上創建一個Ajax調用,並獲得第二個動作。 – Valkyrie

回答

1

你需要做2個請求下載的文件,並顯示局部視圖,在2個不同的動作。

顯示部分視圖的代碼似乎沒問題,但文件不會下載,因爲您不會將其設置爲操作的結果。

爲了下載文件,您必須發出第二個請求。您不能使用Ajax調用它,因爲瀏覽器不會將其作爲文件下載。只需重定向到該文件。請參閱此問題以瞭解如何執行此操作:Download File Using Javascript/jQuery

如果部分視圖和文件基於同一報告,則2個請求可能會生成兩次,請考慮添加一些緩存以避免生成多次相同的參數。

+0

謝謝@glacasa – SPNick