簡體   English   中英

MVC流輸出到HTML div

[英]MVC Stream outputting to 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語句指出它應該更新為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;
    }
} 

這個問題非常明顯,因為您正在使用Ajax表單下載文件。 最重要的是,您正在使用內置的Microsoft Ajax庫,該庫似乎還不夠智能。

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

  1. 最簡單的解決方案(我過去使用過)是,您自己創建一個excel文件並將其保存在服務器上,然后將下載鏈接發送給用戶,而不是自己親自傳輸文件。 它不需要對代碼進行大量更改。

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

希望有道理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM