Я задал этот вопрос сегодня на форуме 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>
Спасибо за помощь!