【问题标题】:How to render Active Reports WebViewer in ASP.NET MVC如何在 ASP.NET MVC 中呈现活动报表 WebViewer
【发布时间】:2012-02-21 11:33:42
【问题描述】:

我今天早些时候在 DataDynamics 论坛上提出了这个问题。我想也许我会在这里得到某种回应。

我正在尝试在我的 ASP.NET MVC 应用程序中启动并运行 WebViewer。 我正在尝试在控制器(webViewer.RenderControl(htmlTextWriter) 中呈现 webviewer,然后将结果放入 ViewData 并在我的视图中显示报告。我什至不知道这是否是正确的方法。任何帮助将不胜感激。

控制器代码:

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

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>

错误:

对象引用未设置为对象的实例。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

来源错误:

第 60 行:var htmlTextWriter = new HtmlTextWriter(stringWriter); 第 61 行:webViewer.RenderBeginTag(htmlTextWriter); 第 62 行:webViewer.RenderControl(htmlTextWriter); 第 63 行:webViewer.RenderEndTag(htmlTextWriter); 第 64 行:

源文件:C:\Projects\xxxx\xxxx\app\xxxx.Web.Controllers\ReportsController.cs 行:62

****更新:****

根据 scott 的回答(谢谢),我的控制器现在看起来像这样:

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

我的视图看起来像这样:(我的视图没有代码隐藏文件)。

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

我看到它通过调试器,它似乎正确地通过了详细信息部分,将值放入我的字段中。但完成后,我收到消息“未指定报告。”我希望我真的不必在视图中使用代码隐藏文件,因为我没有在任何地方使用它们别的。我还进行了调试以验证 report.Document.Pages.Count > 0。我已将代码块放在 WebViewer 控件的上方和下方(认为这并不重要)。还有其他想法吗?

****更新#2:****

我最终使用了此处找到的答案:Alternative to using the OnLoad event in an ASP.Net MVC View? 与下面 scott 的出色答案相结合。生成报告并将其绑定到控件是一个时间问题。所以我的视图最终看起来像这样......(其中 Model.Report 是一个 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>

感谢大家的帮助!

【问题讨论】:

    标签: asp.net asp.net-mvc reporting activereports


    【解决方案1】:

    我们对此进行了内部调查,并找到了以下解决方案。您可以正常将 WebViewer 添加到 View 中。您的示例中不需要复杂的低级交互代码。相反,只需将 WebViewer 添加到您的 aspx 视图中即可。在我们的示例中,WebViewer 添加如下:

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

    这足以让 WebViewer 处理视图。

    在控制器中,我们指定了一个 ActiveReport,如下所示:

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

    在视图的代码隐藏中,我们将报表与视图挂钩:

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

    然后棘手的部分开始了。在 ASP.NET 下运行时,ActiveReports 会使用一些 IHttpHandlers 来处理某些查看器类型,例如 AcrobatReader / PDF。为确保我们的处理程序正常工作,您必须获得 ASP.NET MVC 路由以允许它们正常处理。幸运的是,这样做很容易。只需将以下代码行添加到 Global.asax.cs 文件中:

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

    这将忽略路线。请注意,根据我的阅读可能存在问题,因为 ASP.NET 路由似乎只允许像这样的单个“catch all”路由。因此,如果您有多个 IgnoreRoute 命令,或者您对 .axd 文件有任何问题,则需要修改约束字典参数以适应 .axd 和 .ArCacheItem。

    有关更多信息,请参阅以下文章:http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

    您可以从我们的论坛http://www.datadynamics.com/forums/ShowPost.aspx?PostID=121907#121907下载完整示例

    斯科特·威勒克
    数据动态 / GrapeCity

    【讨论】:

    • +1 获取非常有用的信息,谢谢!我需要澄清的唯一细节是如何避免使用实际的代码隐藏文件(请参阅stackoverflow.com/questions/566902
    • 很高兴回答了您的问题。我们绝对不应该添加代码隐藏,只是将事件处理程序添加到 aspx 中。无论如何,这很简单,很高兴你找到了解决方案!
    【解决方案2】:

    对于遇到此问题并使用 IIS7 的任何其他人,请确保在 &lt;handlers&gt; 部分而不是 &lt;httpHandlers&gt; 下添加活动报告处理程序。

    <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"/>
    

    我认为我的 IgnoreRoute 设置不正确,因为我遇到了 404 错误。但是,我遵循 ActiveReports 提供的教程,该教程将它们放在 IIS6 部分而不是 IIS7 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多