【问题标题】:MVC Stream outputting to HTML divMVC 流输出到 HTML div
【发布时间】:2011-08-12 13:35:06
【问题描述】:

一个 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 - 这就是它正在做的事情(通过 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;
    }
} 

【问题讨论】:

    标签: c# asp.net-mvc stream


    【解决方案1】:

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

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

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

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

    希望它有意义。

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      相关资源
      最近更新 更多