2011-04-25 74 views
1

小問題在這裏與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; 
    } 
} 

回答

1

問題很明顯,您正在使用Ajax表單來下載文件。最重要的是,您正在使用內置的Microsoft Ajax庫,這些庫似乎不夠智能。

我可以提供2個解決方案:

  1. 最簡單的方法(這是我在過去使用的)是不是自己的流媒體文件,創建一個Excel文件並將其保存在服務器上,然後將下載鏈接發送給用戶。它不需要對代碼進行很多更改。

  2. 你可以處理AjaxForm的OnSubmit事件,看看你是否需要下載文件。如果是,則發出完整的回發請求(使用$.post())。這樣瀏覽器會自動彈出對話框詢問要下載的地方。

希望它是有道理的。