Hice esta pregunta en el foro DataDynamics el día de hoy. Pensé que tal vez obtendría algún tipo de respuesta aquí en SO.Cómo renderizar Active Reports WebViewer en ASP.NET MVC
Estoy intentando que el WebViewer funcione y se ejecute en mi aplicación ASP.NET MVC. Estoy intentando renderizar el webviewer en el controlador (webViewer.RenderControl (htmlTextWriter) y luego poner los resultados en ViewData y mostrar el informe en mi opinión. No sé ni siquiera si esta es la forma correcta de hacerlo. ayuda sería muy apreciada
código de controlador:.
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();
}
código
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>
Error:
Referencia de objeto no establecida en una instancia de un objeto. Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.
Detalles de la excepción: System.NullReferenceException: Referencia de objeto no establecida en una instancia de un objeto.
Error de origen:
Línea 60: var = new HtmlTextWriter HtmlTextWriter (StringWriter); Línea 61: webViewer.RenderBeginTag (htmlTextWriter); Línea 62: webViewer.RenderControl (htmlTextWriter); Línea 63: webViewer.RenderEndTag (htmlTextWriter); Línea 64:
Archivo de origen: C: \ Projects \ xxxx \ xxxx \ app \ xxxx.Web.Controllers \ ReportsController.cs Línea: 62
**** Actualización: ****
sobre la base de la respuesta de scott (gracias) mi regulador ahora se ve así:
public ActionResult Display()
{
ViewData["Report"] = new DetailedReport { ReportData = new DetailedReport { ReportData = new DetailedData() { Repository = _repository } };
return View();
}
Y mi punto de vista es el siguiente: (no tengo código detrás de los archivos de mis puntos de vista).
<%
var report = (ActiveReport3) ViewData["Report"];
report.Run();
WebViewer1.Report = report;
%>
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />
Lo miro pasar por el depurador, y parece pasar correctamente a través de la sección de Detalles, poniendo valores en mis campos. Pero después de todo está hecho, recibo el mensaje "Sin informe especificado". Espero que realmente no tenga que usar un archivo de código subyacente en mi vista porque no los estoy usando en ningún otro lado. También he depurado para verificar ese informe.Document.Pages.Count> 0. He puesto el bloque de código tanto arriba como debajo del control WebViewer (no creo que eso realmente importe). ¿Alguna idea adicional?
**** Actualización # 2: ****
Terminé usando la respuesta se encuentra aquí: Alternative to using the OnLoad event in an ASP.Net MVC View? en combinación con una excelente respuesta de Scott a continuación. Fue un momento de generar y vincular el informe al control. Entonces mi Vista se ve así al final ... (donde Modelo.Informe es un 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>
¡Gracias por la ayuda de todos!
+1 para obtener información muy útil, gracias! el único detalle que necesitaba aclarar era cómo evitar el uso de un archivo codebehind real (ver http://stackoverflow.com/questions/566902) –
Me alegro de que haya respondido a su pregunta. Definitivamente no deberíamos haber agregado un código subyacente, solo agregamos el controlador de eventos en el aspx. De todos modos, eso fue bastante simple, ¡feliz de que hayas encontrado una solución! –