Как визуализировать Active Reports WebViewer в ASP.NET MVC
-
21-08-2019 - |
Вопрос
Я задал этот вопрос сегодня на форуме DataDynamics.Я подумал, что, возможно, я получу какой-то ответ здесь, в SO.
Я пытаюсь запустить WebViewer в своем приложении ASP.NET MVC.Я пытаюсь отобразить веб-просмотрщик в контроллере (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:вар htmlTextWriter = новый HtmlTextWriter (stringWriter);Строка 61:webViewer.RenderBeginTag(htmlTextWriter);Строка 62:webViewer.RenderControl(htmlTextWriter);Строка 63:webViewer.RenderEndTag(htmlTextWriter);Строка 64:
Исходный файл:C:\Projects\xxxx\xxxx\app\xxxx.Web.Controllers eportsController.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" />
Я наблюдаю, как он проходит через отладчик, и кажется, что он правильно проходит через раздел «Сведения», помещая значения в мои поля.Но после того, как все сделано, я получаю сообщение «Отчет не указан». Я надеюсь, что мне действительно не придется использовать файл кода программной части в моем представлении, потому что я больше нигде их не использую.Я также отладил, чтобы проверить, что report.Document.Pages.Count > 0.Я поместил блок кода выше и ниже элемента управления WebViewer (не думаю, что это имеет большое значение).Есть дополнительные мысли?
****Обновление №2:****
В итоге я использовал ответ, найденный здесь: Альтернатива использованию события OnLoad в представлении ASP.Net MVC? в сочетании с отличным ответом Скотта ниже.Это был вопрос времени с созданием и привязкой отчета к элементу управления.Итак, мой взгляд в конечном итоге выглядит так...(где 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>
Спасибо всем за помощь!
Решение
Мы провели внутреннее исследование и нашли следующее решение.Вы можете добавить WebViewer в представление обычным способом.В вашем примере нет необходимости в сложном низкоуровневом коде взаимодействия.Вместо этого просто добавьте WebViewer в представление aspx обычным способом.В нашем примере WebViewer был добавлен следующим образом:
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />
Этого достаточно, чтобы WebViewer начал работать с представлением.
В контроллере мы указали ActiveReport следующим образом:
ViewData["Report"] = new SampleReport();
В коде представления мы подключаем отчет к представлению:
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
Другие советы
Для всех, у кого возникла эта проблема и кто использует 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.