Domanda

Ho fatto questa domanda nel forum DataDynamics prima di oggi. Ho pensato che forse avrei avuto un qualche tipo di risposta qui a SO.

Sto cercando di ottenere il Visualizzatore Web installato e funzionante nella mia applicazione ASP.NET MVC. Sto tentando di rendere il Visualizzatore Web nel controller (webViewer.RenderControl (HtmlTextWriter) e poi mettere i risultati in Viewdata e visualizzare il report, a mio avviso. I dont' nemmeno se questo è il modo corretto di andare su questo. Qualsiasi aiuto sarebbe molto apprezzato.

Controller cod:

    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();
    }

Codice 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>

Errore:

Il riferimento non impostato a un'istanza di un oggetto. Descrizione: Un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Si prega di rivedere l'analisi dello stack per ulteriori informazioni sull'errore e dove ha avuto origine nel codice.

Dettagli eccezione: System.NullReferenceException:. Il riferimento non impostato a un'istanza di un oggetto

Errore Origine:

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

File di origine: C: \ Progetti \ xxxx \ xxxx \ app \ xxxx.Web.Controllers \ ReportsController.cs Linea: 62

**** Aggiornamento: ****

In base alla risposta di Scott (grazie) il mio controller ora assomiglia a questo:

    public ActionResult Display()
    {
        ViewData["Report"] = new DetailedReport { ReportData = new DetailedReport { ReportData = new DetailedData() { Repository = _repository } };
        return View();
    }

E mio punto di vista è simile al seguente:. (Non ho alcun codice dietro file per le mie opinioni)

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

Io lo guardo passare attraverso debugger, e sembra fare un passo in modo corretto attraverso la sezione Dettagli, mettendo i valori nei miei campi. Ma dopo tutto è fatto, viene visualizzato il messaggio "No report specificato." che sto sperando che davvero non c'è bisogno di utilizzare un file codebehind sul mio punto di vista, perché non sto usando da nessuna parte altro. Ho anche il debug per verificare che report.Document.Pages.Count> 0. Ho messo il blocco di codice sia sopra che sotto il controllo Visualizzatore Web (non credo che conta davvero). Ogni pensiero supplementari?

**** Aggiornamento # 2: ****

Ho finito per usare la risposta trovato qui: alternativa all'utilizzo l'evento OnLoad in un'ASP.Net MVC View in combinazione con ottima risposta di Scott sotto. E 'stata una cosa di temporizzazione con la generazione e vincolante la relazione al controllo. Così la mia vista si presenta così alla fine ... (dove Model.Report è 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>

Grazie per l'aiuto di tutti!

È stato utile?

Soluzione

Abbiamo studiato questo internamente ed ha trovato la seguente soluzione. È possibile aggiungere il Visualizzatore Web per una visualizzazione normale. Non v'è alcuna necessità di complicate a basso livello di codice interazione nel tuo esempio. Invece, basta aggiungere il Visualizzatore Web per la visualizzazione aspx normalmente. Nel nostro campione il Visualizzatore Web è stato aggiunto il seguente:

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

Questo è sufficiente per ottenere il WebViewer lavorando sulla vista.

Nel regolatore abbiamo specificato un ActiveReport come segue:

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

Nel codebehind della vista che agganciare il rapporto per la vista:

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

Poi la parte difficile inizia. Ci sono alcuni IHttpHandlers utilizzati da ActiveReports durante l'esecuzione in ASP.NET per alcuni dei tipi di spettatori, come Acrobat Reader / PDF. Per garantire ai nostri gestori stanno lavorando è necessario ottenere ASP.NET MVC routing per consentire loro di elaborare come normale. Fortunatamente è facile farlo. Basta aggiungere la seguente riga di codice al file Global.asax.cs:

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

che ignorerà il percorso. Si noti che, secondo la mia lettura ci possono essere problemi in quanto il routing ASP.NET sembra consentire solo un unico percorso "catturare tutti" come questo. Pertanto, se si dispone di più di questi IgnoreRoute comandi e o avete problemi con un file axd, è necessario modificare i vincoli argomento dizionario ad accontentare l'axd così come .ArCacheItem.

Per ulteriori informazioni vedere il seguente articolo: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

È possibile scaricare l'esempio completo dal nostro forum http: // www.datadynamics.com/forums/ShowPost.aspx?PostID=121907#121907

Scott Willeke
dati Dynamics / GrapeCity

Altri suggerimenti

Per chiunque altro abbia questo problema e utilizzando IIS7 Assicurati di aggiungere le relazioni gestori attivi sotto la <handlers> sezione non <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"/>

pensavo di avere la configurazione IgnoreRoute impropriamente perché mi stavo errori 404. Comunque stavo seguendo il tutorial data dal ActiveReports che li ha nella sezione IIS6 invece di IIS7.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top