MVC Stream выводит в HTML div - PullRequest
       4

MVC Stream выводит в HTML div

1 голос
/ 26 апреля 2011

Небольшая проблема здесь с приложением 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, когда дело доходит до возврата файла - это не так.То, что я вижу, это много символов на экране (в div 'panelReport' - см. Ниже), смешанных с данными, которые будут в файле 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 утверждает, что он должен обновиться до div panelReport - что он и делает (через частичное представление 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;
    }
} 

1 Ответ

1 голос
/ 26 апреля 2011

Проблема довольно очевидна в том, что вы используете Ajax Form для загрузки файла.Сверху вы используете встроенные библиотеки Microsoft Ajax, которые кажутся недостаточно интеллектуальными.

Я могу предложить 2 решения:

  1. Самое простое решение (которое я использовал в прошлом) состоит в том, что вместо потоковой передачи файла самостоятельно создайте файл Excel исохраните его на сервере, а затем отправьте ссылку на скачивание пользователю.Это не потребует больших изменений в коде.

  2. Вы можете обработать событие OnSubmit AjaxForm, посмотрите, если это файл для загрузки.Если да, то сделайте полный запрос обратной передачи (используя $.post()).Таким образом, браузер автоматически откроет диалоговое окно с вопросом, где можно загрузить.

Надеюсь, это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...