[英]MVC Stream outputting to HTML div
這里是MVC應用程序的一個小問題,我不確定該如何解決。
基本上,我要向最初由其他人(c#)創建的系統添加其他功能。 對於報告系統,結果僅顯示在屏幕上。 現在,我正在構建該功能,以允許用戶將其報告下載為Excel文檔。
因此,基本上,我有一個向用戶顯示日期范圍和其他一些搜索優化選項的視圖。 我介紹了一個單選按鈕,如果選中該按鈕,將下載報告,而不是在屏幕上顯示報告。
這是我在ReportController中執行的三個操作:
public ActionResult Index()
{
return View();
}
public ActionResult ProductReport(AdminReportRequest reportRequest, FormCollection formVariables)
{
AdminEngine re = new AdminEngine();
if (!reportRequest.Download)
{
AdminReport report = re.GetCompleteAdminReport(reportRequest);
return View(report);
}
Stream ExcelReport = re.GetExcelAdminReport(reportRequest);
TempData["excelReport"] = ExcelReport;
return RedirectToAction("ExcelProductReport");
}
public FileResult ExcelReport()
{
var ExcelReport = TempData["excelReport"] as Stream;
return new FileStreamResult(ExcelReport, "application/ms-excel")
{
FileDownloadName = "Report" + DateTime.Now.ToString("MMMM d, yyy") + ".xls"
};
}
我已經通過AdminEngine進行了調試,一切看起來都很好。 但是,在ExcelReport動作中,要返回文件-不會。 我看到的是屏幕上有很多字符(在“ panelReport” div中-見下文),與excel文件中的數據混合在一起。
我想我已經確定它在屏幕上顯示的原因是某些代碼的結果
在“索引”視圖中編寫的:
<% using (Ajax.BeginForm("ProductReport", "Report", null,
new AjaxOptions
{
UpdateTargetId = "panelReport",
InsertionMode = InsertionMode.Replace,
OnSuccess = "pageLoaded",
OnBegin = "pageLoading",
OnFailure = "pageFailed",
LoadingElementId = ""
},
new { id = "SearchForm" })) %>
如您所見,Ajax.BeginForm語句指出它應該更新為panelReport div-這就是它所做的(通過Product Report部分視圖)。 雖然這非常適合需要在屏幕上顯示報告的情況,但顯然它不適用於excel文件。
有沒有解決此問題的方法,而無需過多更改現有代碼?
如果需要了解情況,這是我處理excel文件的類:
報告類別:
public Stream GetExcelAdminReport(AdminReportRequest reportRequest)
{
AdminReport report = new AdminReport();
string dateRange = null;
List<ProductSale> productSales = GetSortedListOfProducts(reportRequest, out dateRange);
report.DateRange = dateRange;
if (productSales.Count > 0)
{
report.HasData = true;
CustomisedSalesReport CustSalesRep = new CustomisedSalesReport();
Stream SalesReport = CustSalesRep.GenerateCustomisedSalesFile(productSales);
return SalesReport;
}
}
工種:
public class CustomisedSalesReport
{
public Stream GenerateCustomisedSalesFile(List<ProductSale> productSales)
{
MemoryStream ms = new MemoryStream();
HSSFWorkbook templateWorkbook = new HSSFWorkbook();
HSSFSheet sheet = templateWorkbook.CreateSheet("Sales Report");
//Workings
templateWorkbook.Write(ms);
ms.Position = 0;
return ms;
}
}
這個問題非常明顯,因為您正在使用Ajax表單下載文件。 最重要的是,您正在使用內置的Microsoft Ajax庫,該庫似乎還不夠智能。
我可以提供2個解決方案:
最簡單的解決方案(我過去使用過)是,您自己創建一個excel文件並將其保存在服務器上,然后將下載鏈接發送給用戶,而不是自己親自傳輸文件。 它不需要對代碼進行大量更改。
您可以處理AjaxForm的OnSubmit事件,看看它是否是要下載的文件。 如果是,則發出完整的回發請求(使用$.post()
)。 這樣,瀏覽器將自動彈出對話框,詢問下載位置。
希望有道理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.