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