小問題在這裏與MVC應用程序,我不知道如何找出解決辦法。MVC流輸出到HTML格
基本上,我將附加功能添加到最初由其他人創建的系統(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 - 這就是它正在做的事情(通過產品報告部分視圖)。雖然這對於需要在屏幕上顯示報告的情況非常適用,但顯然不會使用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;
}
}