2009-03-20 16 views
13

Ho fatto questa domanda nel forum DataDynamics oggi. Ho pensato che forse avrei avuto una sorta di risposta qui a SO.Come visualizzare Web Reportser di Active Reports in ASP.NET MVC

Sto cercando di ottenere il WebViewer attivo e funzionante nella mia applicazione ASP.NET MVC. Sto tentando di eseguire il rendering del visualizzatore Web nel controller (webViewer.RenderControl (htmlTextWriter), quindi di inserire i risultati in ViewData e di visualizzare il report nella mia vista. Non so nemmeno se questo è il modo corretto per farlo. 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:

Riferimento oggetto non impostato su un'istanza di un oggetto. Descrizione: si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Si prega di rivedere la traccia dello stack per ulteriori informazioni sull'errore e sulla sua origine nel codice.

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

Origine errore:

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

Fonte: C: 62

**** Aggiornamento:: Progetti \ xxxx \ xxxx \ app \ xxxx.Web.Controllers \ ReportsController.cs Linea \ ****

sulla base della 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 alla fine, ricevo il messaggio "Nessun rapporto specificato". Spero davvero di non dover usare un file codebehind sulla mia vista perché non li sto usando da nessun'altra parte. Ho anche eseguito il debug per verificare che report.Document.Pages.Count> 0. Ho messo il blocco di codice sia sopra che sotto il controllo WebViewer (non credo che sia davvero importante). Qualche idea in più?

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

ho finito per usare la risposta trovata qui: Alternative to using the OnLoad event in an ASP.Net MVC View? in combinazione con ottima risposta di Scott sotto. Era una cosa di temporizzazione con la generazione e l'associazione del rapporto al controllo. Quindi la mia vista sembra così alla fine ... (dove Modello.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!

risposta

10

Abbiamo studiato questo internamente e abbiamo trovato la seguente soluzione. È possibile aggiungere normalmente WebViewer a una vista. Nel tuo esempio non è necessario il complicato codice di interazione di basso livello. Invece, basta aggiungere il visualizzatore Web alla vista 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 visualizzazione agganciamo relazione alla vista:

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

Poi la parte difficile comincia. Esistono alcuni IHttpHandler utilizzati da ActiveReports quando sono in esecuzione in ASP.NET per alcuni tipi di visualizzatori come AcrobatReader/PDF. Per garantire che i nostri gestori stiano funzionando, è necessario ottenere il routing di ASP.NET MVC per consentire loro di elaborare normalmente. 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 dal momento che il routing ASP.NET sembra consentire solo un singolo percorso "catch all" come questo. Pertanto, se si dispone di più di questi comandi IgnoreRoute e si riscontrano problemi con un file .axd, è necessario modificare l'argomento del dizionario dei vincoli per soddisfare sia l'.axd che l'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
Dynamics dati/GrapeCity

+0

+1 per informazioni molto utili, grazie! l'unico dettaglio che avevo bisogno di chiarire era come evitare di usare un vero file codebehind (vedi http://stackoverflow.com/questions/566902) –

+0

Felice che abbia risposto alla tua domanda. Non dovremmo sicuramente aver aggiunto un code-behind, ma abbiamo aggiunto il gestore di eventi all'aspx. Ad ogni modo, è stato abbastanza semplice, felice che tu abbia trovato una soluzione! –

3

Per chiunque altro abbia questo problema e utilizzando IIS7 Assicurarsi di aggiungere i gestori di report attivi nella sezione <handlers> 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"/> 

Ho pensato di avere l'installazione IgnoreRoute in modo errato perché stavo ottenendo 404 errori. Tuttavia stavo seguendo il tutorial fornito da ActiveReports che li ha nella sezione IIS6 invece di IIS7.

Problemi correlati