Question

J'ai posé cette question dans le forum DataDynamics plus tôt aujourd'hui. Je pensais que peut-être j'obtenir une sorte de réponse ici au SO.

Je suis en train d'obtenir le WebViewer et en cours d'exécution dans mon application ASP.NET MVC. Je cherche à rendre le webviewer dans le contrôleur (webViewer.RenderControl (HtmlTextWriter), puis mettre les résultats en ViewData et afficher le rapport à mon avis. Je ne » sais même si cela est la bonne façon d'aller à ce sujet. Toute aide serait grandement apprécié.

Code contrôleur:

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

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

Erreur:

Référence d'objet non définie à une instance d'un objet. Description: Une exception non gérée produite lors de l'exécution de la demande Web actuelle. S'il vous plaît examiner la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails de l'exception: System.NullReferenceException:. Référence d'objet non définie à une instance d'un objet

Erreur source:

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

Fichier source: C: \ Projects \ xxxx \ xxxx \ app \ xxxx.Web.Controllers \ ReportsController.cs ligne: 62

**** Mise à jour: ****

Sur la base de la réponse par scott (merci) mon contrôleur ressemble maintenant à ceci:

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

Et moi ressemble à ceci:. (Je n'ai pas de code derrière les fichiers de mon point de vue)

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

Je regarde passer par débogueur, et il semble à l'étape correctement à travers la section Détails, mettre des valeurs dans mes champs. Mais après tout est fait, je reçois le message « Pas de rapport spécifié. » J'espère que je n'ai pas vraiment d'utiliser un fichier codebehind sur moi parce que je ne suis pas les utiliser partout autre. J'ai aussi débogué pour vérifier que report.Document.Pages.Count> 0. J'ai mis le bloc de code au-dessus et en dessous de la commande de WebViewer (ne pense pas que ce qui compte vraiment). Toutes les pensées supplémentaires?

**** Mise à jour # 2: ****

Je fini par utiliser la réponse trouvée ici: alternative à l'utilisation de l'événement OnLoad dans un ASP.Net MVC Voir en combinaison avec une excellente scott réponse ci-dessous. Ce fut une chose synchronisation avec la production et liant le rapport au contrôle. Donc, mon point de vue ressemble à ceci à la fin ... (où Model.Report est 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>

Merci pour l'aide de tout le monde!

Était-ce utile?

La solution

Nous avons étudié cette interne et a trouvé la solution suivante. Vous pouvez ajouter WebViewer à une vue normale. Il n'y a pas besoin de code d'interaction faible niveau complexe dans votre exemple. Au lieu de cela, il suffit d'ajouter le WebViewer à votre vue ASPX normalement. Dans notre échantillon, la WebViewer a été ajouté comme suit:

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

Cela suffit pour obtenir le WebViewer de travail sur la vue.

Dans le contrôleur nous avons spécifié un ActiveReport comme suit:

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

Dans la codebehind de la vue que nous accrochons le rapport à la vue:

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

Ensuite, la partie la plus délicate commence. Il y a quelques IHttpHandlers utilisés par ActiveReports lors de l'exécution sous ASP.NET pour certains types de téléspectateurs tels que AcrobatReader / PDF. Pour nous assurer que nos gestionnaires travaillent, vous devez obtenir le routage ASP.NET MVC pour leur permettre de traiter normalement. Heureusement, il est facile de le faire. Il suffit d'ajouter la ligne de code suivante dans le fichier Global.asax.cs:

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

Ce ignorera la route. Notez que d'après ma lecture il peut y avoir des problèmes car le routage ASP.NET semble permettre qu'un seul « fourre-tout » route comme ça. Par conséquent, si vous avez plusieurs de ces IgnoreRoute commandes et ou vous avez des problèmes avec un fichier .axd, vous devrez modifier les contraintes arguments dictionnaire pour accomidate le .axd ainsi que .ArCacheItem.

Pour plus d'informations, consultez l'article suivant: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

Vous pouvez télécharger l'échantillon complet de nos forums http: // www.datadynamics.com/forums/ShowPost.aspx?PostID=121907#121907

Scott Willeke
données Dynamics / GrapeCity

Autres conseils

Pour toute autre personne ayant ce problème et en utilisant IIS7 Assurez-vous que vous ajoutez les gestionnaires de rapports actifs sous la section non <handlers> <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"/>

Je pensais avoir mal la configuration IgnoreRoute parce que je recevais 404 erreurs. Cependant, je suivais le tutoriel donné par ActiveReports qui les a dans la section IIS6 au lieu de IIS7.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top