2011-04-25 76 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())。这样浏览器会自动弹出对话框询问要下载的地方。

希望它是有道理的。