MVC流输出到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语句声明它应该更新到panelReportdiv——这就是它正在做的(通过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库,它似乎不够智能。

我可以提供两个解决方案:

  1. 最简单的解决方案(我过去使用过)是,而不是自己流式传输文件,创建一个excel文件并将其保存在服务器上,然后将下载链接发送给用户。它不需要对代码做很多修改。

  2. 你可以处理AjaxForm的OnSubmit事件,看看它是不是一个要下载的文件。如果是,则发出一个完整的回发请求(使用$.post())。这样,浏览器会自动弹出对话框,询问在哪里下载。

相关内容

  • 没有找到相关文章

最新更新