Веб экспорт и печать в Asp.net

отредактировано June 2010 Раздел: FastReport .NET
Привет техподдержка, а Александру персональный пламенный привет! :)

Прежде всего спасибо за ваше бравое дело, которое живет :)

Имею след проблему:
У мну есть страница, которая динамически подгружает нужные UserControls в зависимости от параметров URL.
Один из этих контролов содержит WebReport. При попытке экпорта или печати этого отчета, после постбека URL в риквесте теряет параметры.
Похоже, что постбек при экпорте не предусмотрен, поскольку идет редирект с параметрами, что есть криво ИМХО. :)
Посмотрев код исходников, нашел интересную штуку:
private string GetReponseRedirect(string guid)
{
     return this.Page.Request.CurrentExecutionFilePath + "?" + FExportPrefix + "=" + guid;
}
А как же быть с остальными параметрами, если WebReport пусть даже при редиректе теряет уже существоващие параметры?
Как результат такого выполнения, после нажатия кнопки экпорта или печати я получаю загруженными на странице совсем не те юзерконтролы которые мне нужны.

Если идти таким путем, то по идее надо более ровно парсить уже существующие параметры, хотя я ожидаю постбек, я идет редирект.

Я понимаю, почему так сделано, но все равно не совсем верно. Ведь после такого редиректа я потеряю значения всех контролов которые были проиницилизированы на странице пользователем вне отчета. Я там еще нашел закомментированный код с попытками дернуть экспорт в новом окне. Как вариант могу подкинуть идею попробовать использовать IFRAME, чтобы не хлопать окнами при формирования Response c результатом экпорта.

Как пример, было:
http://localhost:88/Corporate/Corporate.aspx?type=statistics&ID=e5ed68b2-3c11-481e-aff6-154a7d996874
После экспорта стало:
http://localhost:88/Corporate/Corporate.aspx?frxexp=5cda970c-1525-4646-880e-787b803f3244&ID=e5ed68b2-3c11-481e-aff6-154a7d996874
Как результат параметр type канул в лету :)

Комментарии

  • отредактировано June 2010
    Более детально изучил исходники, есть идея, сейчас проверю.
  • отредактировано June 2010
    Закидываю как идею с реализацией, выживет\не выживет - на ваше усмотрение. Код проекта в аттаче.

    Вынес реализацию получения результатов экпорта в отдельный HttpHandler и добавил пропертю в WebExportItem, поскольку мне кажется, что респонсу все-таки надо указывать ContentType. Это решает все путаницы с параметрами и т.д., поскольку все равно обмен идет через Кеш вебсервера.

    Регистрируем хандлер в webconfig:
          <add name="FastReportExportHandler" path="*.frh" verb="*" type="FastReport.Web.Handlers.ExportHandler" resourceType="Unspecified" preCondition="integratedMode" />
    
    Добавляем указание ContentType во все методы экпорта, например для PDF:
                    ExportItem.Format = "pdf";
                    ExportItem.ContentType = "application\\pdf";
                    ResponseExport(guid, ExportItem);
    
    И меняем код метода ResponseExport на что-то типа такого:
            private void ResponseExport(string guid, WebExportItem ExportItem)
            {
                ExportItem.FileName = GetExportFileName(ExportItem.Format);
                CacheAdd("frxExport" + guid, ExportItem, null, 5);
                this.Page.Response.Redirect("~/Export.frh?ID="+guid, true);
            }
    
    Остается повесить JavaScript на кнопку экпорта с открытием нового окошка браузера в который толкнуть урл на хендлер с параметром гуида отчета.

    И еще. Поотпадали картинки кнопок на тулбаре, если WebReport кинуть на UserControl.
    Глянул код одним глазом, думаю стоит сделать через WebResources. Бегло почитать можно здесь.
  • отредактировано 09:23
    Устранил все, что меня не устраивало. Проект выложил вам на битрикс, чтоб не светить в паблике, смотрите мой тикет.

    1. Загрузка происходит через отдельный HttpHandler
    2. Устранены проблемы с параметрами URL при экпорте, я этот метод просто выкинул потому что п.1.
    3. Правильно формируется ContentType для стрима с экпортом и стрим содержит правильные хидеры с именем файла и другими атрибутами.
    4. Печать из тулбара открывается в новом окне (popup), загружая Acrobat Reader ActiveX.
    5. Кнопки тулбара уехали с файловой системы в WebResources. Если ButtonPath не указан тянет из ресурсов библиотеки.

    Жду фидбека, мне эти изменения критичны.

    Спасибо.
  • отредактировано 09:23
    Андрей, спасибо, ответил в битриксе.
  • отредактировано 09:23
    Еще, вопрос по логике работы с веб отчетом:

    Имею след код, который припарит отчет и толкает в него параметры
    protected void Page_Load(object sender, EventArgs e)
            {
                if (!this.IsPostBack)
                {
                    this._presenter.OnViewInitialized();
                    InitControls();
                    RunReport();
                }
                this._presenter.OnViewLoaded();
            }
            
    private void InitControls()
            {
               dtpDate.Text = DateTime.Now.ToShortDateString();
            }
    
      private void RunReport()
            {
                WebReport.Prepare(); 
            } 
           protected void WebReport_StartReport(object sender, EventArgs e)
            {
                WebReport.Report.SetParameterValue("SelectedDate", DateTime.Parse(dtpDate.Text)); // set external params
            }
    

    При первой загрузке отчсета все шикарно, рипорт припарится, параметры в событии StartReport передаются.
    При экспорте или печати все тоже работает правильно, поскольку выполняется вот это из ваших сорцов:
            private void ClearExportCache(string guid)
            {
                if (CacheGet("frxExport" + guid) != null)
                    CacheRemove("frxExport" + guid);
                if (!ReportDone)
                    PrepareReport();
            }
    

    При навигации кнопками на тулбаре, получаю пустой отчет, что есть естесственно, состояния ведь нет.
    Я мог бы конечно заприпарить отчет в постбеке в Page_Load опять, но к тому моменту у меня еще нет значений моих параметров из моих контролов. Как мне быть в такой ситуации?

    По идее, в этом случае мое дело обеспечить только передачу внешних параметров в StartReport и если навигация делатся средствами тулбара, вьюбвер сам должен заботится о запуске.

    Спасибо!
  • отредактировано June 2010
    Нашел проблему похоже.
    Не подымается из кеша экземляр отрендереного отчета.
    После постебека меняется ReportGuid, поскольку почему-то он не сохраняется во вьюстейте, соответсвенно нет такого ключа в кеше. :)
    Разбираюсь почему, думаю это связанно с тем, что я гружу юзерконтрол на котором лежит отчет динамически.
  • отредактировано 09:23
    написал: »
    Нашел проблему похоже.
    Не подымается из кеша экземляр отрендереного отчета.
    После постебека меняется ReportGuid, поскольку почему-то он не сохраняется во вьюстейте, соответсвенно нет такого ключа в кеше. :)
    Разбираюсь почему, думаю это связанно с тем, что я гружу юзерконтрол на котором лежит отчет динамически.

    Все гут, претензии снимаются :)
    Надо править в консерватории :)
  • отредактировано 09:23
    написал: »
    1. Загрузка происходит через отдельный HttpHandler
    2. Устранены проблемы с параметрами URL при экпорте, я этот метод просто выкинул потому что п.1.

    Прежде всего спасибо за новую версию, которая 1.5.

    Многое исправлено, за что всем респект, но проблему с печатью и экпортами так и не устранили. Все так же фастрипорт во время печати или экпортов пытается безапеляционно редиректить со своими параметрами на страницу, где лежит компонета отчета, абсолютно игнорируя пользовательские парамеры в URL. :)

    Я уже предлагал вариант как исправить эту проблему раз и навсегда через HttpHandler.

    Печать и экпорты так и не работают в моем проекте и на новой версии, приходится опять модифицировтаь и компилировть исходники. :)

    Чтоб не быть голословным, скриншот в аттаче (В всплывшем окне - результат печати, вместо стрима с пдфом я получаю редирект на свою же страницу, потому как моя страница формируется динамически, как результатат парамеров в урле, загружая программно мои юзерконтролы. И я об этом писал выше, еще до релиза 1.5, см. мои квоты в этом сообщении)

    Вопрос логичный, как исправить ситуацию?

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.