Pregunta

hice esta pregunta en el foro DataDynamics el día de hoy. Pensé que tal vez me gustaría obtener algún tipo de respuesta aquí en SO.

Estoy tratando de conseguir el WebViewer en marcha y funcionando en mi aplicación ASP.NET MVC. Estoy tratando de hacer que el visor web en el controlador (webViewer.RenderControl (HtmlTextWriter) y luego poner los resultados en ViewData y mostrar el informe en mi opinión. No me' siquiera sabe si esta es la forma correcta de ir sobre esto. Cualquier ayuda sería muy apreciado.

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 a objeto no establecida como una instancia de un objeto. Descripción: 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 acerca del error y dónde se originó en el código.

Detalles de excepciones: System.NullReferenceException:. Referencia a objeto no establecida como una instancia de un objeto

Fuente de error:

Línea 60: var HtmlTextWriter = new HtmlTextWriter (StringWriter); Línea 61: webViewer.RenderBeginTag (HtmlTextWriter); Línea 62: webViewer.RenderControl (HtmlTextWriter); Línea 63: webViewer.RenderEndTag (HtmlTextWriter); Línea 64:

Fuente: 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 archivos para mis visitas)

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

Lo veo pasar por depurador, y parece que con el paso correctamente a través de la sección de detalles, poner valores en mis campos. Pero después de todo está hecho, me sale el mensaje "No se informe especificado." que espero que realmente no tengo que usar un archivo de código subyacente en mi opinión porque no estoy usando en cualquier lugar más. También he depurado para verificar que report.Document.Pages.Count> 0. He puesto el bloque de código por encima y por debajo del control WebViewer (no creo que realmente importa). Cualquier pensamiento adicionales?

**** Actualización # 2: ****

Terminé usando la respuesta encontrada aquí: alternativa al uso del evento OnLoad en un ASP.Net MVC Ver en combinación con una excelente respuesta de scott a continuación. Era una cosa de la sincronización con la generación y vinculante el informe al control. Así que mi opinión es la siguiente con el fin ... (donde Model.Report 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!

¿Fue útil?

Solución

Hemos investigado esto internamente y se encontró la siguiente solución. Puede añadir el WebViewer a una vista normalmente. No hay ninguna necesidad de que el código de la interacción de bajo nivel complicada en su ejemplo. En su lugar, sólo tiene que añadir el WebViewer a la 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 conseguir el WebViewer trabajando en la vista.

En el controlador especificamos un ActiveReport como sigue:

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;

A continuación, la parte difícil comienza. Hay algunas IHttpHandlers utilizados por ActiveReports cuando se ejecuta en ASP.NET para algunos de los tipos de visualización, tales como AcrobatReader / PDF. Para asegurar que nuestros controladores están trabajando debe obtener ASP.NET MVC enrutamiento para que puedan procesar de forma normal. Por suerte es fácil hacerlo. Sólo tiene que añadir la siguiente línea de código al archivo Global.asax.cs:

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

Eso hará caso omiso de la ruta. Tenga en cuenta que de acuerdo con mi lectura puede haber problemas desde ASP.NET enrutamiento parece permitir una única ruta "todo" ni como este. Por lo tanto, si usted tiene múltiples de estos comandos y IgnoreRoute o si tiene algún problema con un archivo .axd, tendrá que modificar las limitaciones argumento diccionario para accomidate la .axd, así como .ArCacheItem.

Para obtener más información, consulte el artículo siguiente: 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

Scott Willeke
datos de la dinámica / GrapeCity

Otros consejos

Para cualquier otra persona tienen este problema y usando IIS7 Asegúrese de agregar los informes de los controladores 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 IgnoreRoute inadecuadamente porque me estaba poniendo 404 errores. Sin embargo estaba siguiendo el tutorial propuesta por ActiveReports que los tiene en la sección IIS6 en lugar de IIS7.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top