C# MVC流输出到HTML div

C# MVC流输出到HTML div,c#,asp.net-mvc,stream,C#,Asp.net Mvc,Stream,MVC应用程序有一个小问题,我不知道如何解决 基本上,我正在为一个最初由其他人(c#)创建的系统添加额外的功能。对于报告系统,结果只在屏幕上显示。现在,我正在构建该功能,以允许用户将其报告下载为Excel文档 因此,基本上,我有一个视图,向用户显示日期范围和一些其他搜索优化选项。我引入了一个单选按钮,如果选中,将下载报告,而不是在屏幕上显示 以下是我在ReportController中的三个操作: public ActionResult Index() { ret

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,这就是它正在做的(通过产品报告部分视图)。当需要在屏幕上显示报告时,这是一个完美的选择,但它显然不适用于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;
        }
}
公共流GetExcelAdminReport(AdminReportRequest)
{
AdminReport=新的AdminReport();
字符串dateRange=null;
List productSales=GetSortedListOfProducts(reportRequest,超出日期范围);
report.DateRange=DateRange;
如果(productSales.Count>0)
{
report.HasData=true;
CustomisedSalesReport CustSalesRep=新CustomisedSalesReport();
Stream SalesReport=CustSalesRep.generateCostomisedSalesFile(productSales);
退货报告;
}
}
工作类别:

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;
    }
} 
公共类CustomisedSalesReport
{
公共流GenerateCustomedSalesFile(列表产品销售)
{
MemoryStream ms=新的MemoryStream();
HSSFWorkbook templateWorkbook=新的HSSFWorkbook();
HSSFSheet sheet=templateWorkbook.CreateSheet(“销售报告”);
//工作方式
模板工作簿。编写(ms);
ms.Position=0;
返回ms;
}
} 

问题很明显,您正在使用Ajax表单下载文件。最重要的是,您正在使用内置的MicrosoftAjax库,这些库似乎不够智能

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

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

  • 您可以处理AjaxForm的OnSubmit事件,看看它是否是要下载的文件。如果是,则发出完整的回发请求(使用
    $.post()
    )。这样,浏览器将自动弹出对话框,询问下载位置


  • 希望有意义。

    问题很明显,您正在使用Ajax表单下载文件。最重要的是,您正在使用内置的MicrosoftAjax库,这些库似乎不够智能

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

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

  • 您可以处理AjaxForm的OnSubmit事件,看看它是否是要下载的文件。如果是,则发出完整的回发请求(使用
    $.post()
    )。这样,浏览器将自动弹出对话框,询问下载位置

  • 希望它有意义