Как визуализировать Active Reports WebViewer в ASP.NET MVC

Я задал этот вопрос сегодня на форуме DataDynamics. Я подумал, что, может быть, я получу какой-то ответ здесь, в SO.

Я пытаюсь запустить WebViewer в моем приложении ASP.NET MVC. Я пытаюсь отобразить webviewer в контроллере (webViewer.RenderControl(htmlTextWriter), а затем помещать результаты в ViewData и отображать отчет в моем представлении. Я даже не знаю, правильно ли это делается. будет с благодарностью.

Код контроллера:

    public ActionResult Display()
    {

        CurrentReport = new DetailedReport { ReportData = new DetailedData() { Repository = _repository } };

        var webViewer = new WebViewer();
        CurrentReport.Run();
        webViewer.ID = "WebViewer1";
        webViewer.Visible = true;
        webViewer.ViewerType = ViewerType.HtmlViewer;
        webViewer.Width = Unit.Percentage(100);
        webViewer.Report = CurrentReport;


        var stringWriter = new StringWriter();
        var htmlTextWriter = new HtmlTextWriter(stringWriter);
        webViewer.RenderBeginTag(htmlTextWriter);
        webViewer.RenderControl(htmlTextWriter);
        webViewer.RenderEndTag(htmlTextWriter);

        ViewData["WebViewer"] = stringWriter.ToString();

        return View();
    }

Код Display.aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Admin.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Register assembly="ActiveReports.Web, Version=5.2.1013.2, Culture=neutral, PublicKeyToken=cc4967777c49a3ff" namespace="DataDynamics.ActiveReports.Web" tagprefix="ActiveReportsWeb" %>
<%@ Import Namespace="xxxx.Core"%>

<asp:Content ID="Content1" ContentPlaceHolderID="ClientAdminContent" runat="server">
    <%=ViewData["WebViewer"] %>
</asp:Content>

Ошибка:

Ссылка на объект не установлена ​​в экземпляр объекта. Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта.

Ошибка источника:

Строка 60: var htmlTextWriter = новый HtmlTextWriter (stringWriter); Строка 61: webViewer.RenderBeginTag(htmlTextWriter); Строка 62: webViewer.RenderControl(htmlTextWriter); Строка 63: webViewer.RenderEndTag(htmlTextWriter); Строка 64:

Исходный файл: C:\Projects\xxxx\xxxx\app\xxxx.Web.Controllers\ReportsController.cs Линия: 62

**** Обновление: ****

Основываясь на ответе Скотта (спасибо), мой контроллер теперь выглядит следующим образом:

    public ActionResult Display()
    {
        ViewData["Report"] = new DetailedReport { ReportData = new DetailedReport { ReportData = new DetailedData() { Repository = _repository } };
        return View();
    }

И мое мнение выглядит так: (у меня нет кода для файлов для моих просмотров).

<%
    var report = (ActiveReport3) ViewData["Report"];
    report.Run();
    WebViewer1.Report = report;
%>
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />

Я смотрю, как он проходит через отладчик, и кажется, что он правильно прошел через раздел "Детали", поместив значения в мои поля. Но в конце концов, я получаю сообщение "Нет заданного отчета".. Я надеюсь, что мне действительно не нужно использовать файл codebehind на моем представлении, потому что я не использую их нигде остальное. Я также отлаживал проверку отчета report.Document.Pages.Count > 0. Я поставил блок кода выше и ниже элемента управления WebViewer (не думаю, что это действительно имеет значение). Любые дополнительные мысли?

**** Обновление № 2: ****

В итоге я нашел ответ, найденный здесь: Альтернатива использованию события OnLoad в ASP.Net MVC View? в сочетании с превосходным ответом scott ниже. Это была временная вещь с генерацией и привязкой отчета к элементу управления. Итак, мой взгляд выглядит так в конце... (где Model.Report является ActiveReport3)

<script runat="server">
    private void Page_Load(object sender, EventArgs e)
    {
        var report = Model.Report;
        report.Run();
        WebViewer1.Report = report;
    }
</script>

<asp:Content ID="Content1" ContentPlaceHolderID="ClientAdminContent" runat="server">
    <ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />
</asp:Content>

Спасибо за помощь!

Ответы

Ответ 1

Мы исследовали это внутренне и нашли следующее решение. Вы можете добавить WebViewer в режим просмотра. В вашем примере нет необходимости в сложном коде взаимодействия с низким уровнем. Вместо этого просто добавьте WebViewer в ваш просмотр aspx. В нашем примере WebViewer был добавлен следующим образом:

<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />

Этого достаточно, чтобы заставить WebViewer работать над представлением.

В контроллере мы указали ActiveReport следующим образом:

ViewData["Report"] = new SampleReport();

В кодовом меню View мы подключаем отчет к представлению:

WebViewer1.Report = ViewData["Report"] as ActiveReport3;

Затем начинается сложная часть. Существуют некоторые IHttpHandlers, используемые ActiveReports при работе в ASP.NET для некоторых типов просмотра, таких как AcrobatReader/PDF. Чтобы наши обработчики работали, вы должны получить маршрутизацию ASP.NET MVC, чтобы они могли обрабатываться как обычно. К счастью, это легко сделать. Просто добавьте следующую строку кода в файл Global.asax.cs:

routes.IgnoreRoute("{*allarcachitems}", new { allarcachitems = @".*\.ArCacheItem(/.*)?" });

Это будет игнорировать маршрут. Обратите внимание, что в соответствии с моим чтением могут возникнуть проблемы, поскольку маршрутизация ASP.NET, по-видимому, допускает только один "поймать весь" маршрут, подобный этому. Поэтому, если у вас есть несколько команд IgnoreRoute и у вас возникли проблемы с файлом .axd, вам нужно будет изменить аргумент слова ограничений для размещения .axd, а также .ArCacheItem.

Подробнее см. в следующей статье: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

Вы можете скачать полный образец с наших форумов по адресу http://www.datadynamics.com/forums/ShowPost.aspx?PostID=121907#121907

Скотт Виллеке
Динамика данных/GrapeCity

Ответ 2

Для всех, кто имеет эту проблему, и используя IIS7 Убедитесь, что вы добавили обработчики активных отчетов в разделе <handlers>, а не <httpHandlers>.

<add name="RPX" verb="*" path="*.rpx" type="DataDynamics.ActiveReports.Web.Handlers.RpxHandler, ActiveReports.Web, Version=6.1.2814.0, Culture=neutral, PublicKeyToken=cc4967777c49a3ff"/>
            <add name="ActiveReport" verb="*" path="*.ActiveReport" type="DataDynamics.ActiveReports.Web.Handlers.CompiledReportHandler, ActiveReports.Web, Version=6.1.2814.0, Culture=neutral, PublicKeyToken=cc4967777c49a3ff"/>
            <add name="ArCacheItem" verb="*" path="*.ArCacheItem" type="DataDynamics.ActiveReports.Web.Handlers.WebCacheAccessHandler, ActiveReports.Web, Version=6.1.2814.0, Culture=neutral, PublicKeyToken=cc4967777c49a3ff"/>

Я думал, что у меня была некорректная установка IgnoreRoute, потому что я получал 404 ошибки. Однако я следил за учебником, данным ActiveReports, который имеет их в разделе IIS6 вместо IIS7.