2009-03-20 46 views
13

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!

Respuesta

10

Hemos investigado esto internamente y hemos encontrado la siguiente solución. Puede agregar WebViewer a una vista normalmente. No es necesario el complicado código de interacción de bajo nivel en su ejemplo. En su lugar, simplemente agregue WebViewer a su vista aspx normalmente. En nuestra muestra la WebViewer se añadió la siguiente manera:

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

Eso es suficiente para obtener el WebViewer trabajando en la vista.

En el controlador que especifica un ActiveReport de la siguiente manera:

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

En el código subyacente de la vista que enganche el informe a la vista:

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

Entonces comienza la parte difícil. Hay algunos IHttpHandlers utilizados por ActiveReports cuando se ejecuta en ASP.NET para algunos de los tipos de visor, como AcrobatReader/PDF. Para garantizar que nuestros manejadores funcionen, debe obtener el enrutamiento ASP.NET MVC para que puedan procesarse de forma normal. Afortunadamente, es fácil hacerlo. Simplemente agregue la siguiente línea de código al archivo Global.asax.cs:

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

Eso ignorará la ruta. Tenga en cuenta que, de acuerdo con mi lectura, puede haber problemas ya que el enrutamiento ASP.NET parece permitir solo una única ruta "catch all" como esta. Por lo tanto, si tiene varios de estos comandos IgnoreRoute o si tiene algún problema con un archivo .axd, deberá modificar el argumento del diccionario de restricciones para acomodar el .axd y el .ArCacheItem.

Para obtener más información, consulte el siguiente artículo: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

Puede descargar la muestra completa de nuestros foros en http://www.datadynamics.com/forums/ShowPost.aspx?PostID=121907#121907

de Scott Willeke
datos de la dinámica/GrapeCity

+0

+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) –

+0

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! –

3

Para cualquier otra persona tienen este problema y el uso de IIS7 Asegúrese de agregar los controladores de informes activos en la sección <handlers> no <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"/> 

Pensé que tenía la configuración de IgnoreRoute incorrectamente porque estaba recibiendo errores 404. Sin embargo, estaba siguiendo el tutorial dado por ActiveReports que los tiene en la sección IIS6 en lugar de IIS7.

Cuestiones relacionadas