如何在ASP.NET MVC中呈现Active Reports WebViewer

时间:2009-03-20 23:16:53

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

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

我正在尝试在我的ASP.NET MVC应用程序中启动并运行WebViewer。 我试图在控制器中渲染webviewer(webViewer.RenderControl(htmlTextWriter),然后将结果放入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&gt; 0.我已将代码块放在WebViewer控件的上方和下方(不要认为真的很重要)。还有其他想法吗?

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

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

感谢大家的帮助!

2 个答案:

答案 0 :(得分:10)

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

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

这足以让WebViewer处理视图。

在控制器中,我们按如下方式指定了ActiveReport:

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

在View的代码隐藏中,我们将报告挂钩到视图:

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

然后棘手的部分开始了。在ASP.NET下为某些查看器类型(如AcrobatReader / PDF)运行时,ActiveReports使用了一些IHttpHandler。为了确保我们的处理程序正常工作,您必须获得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 :(得分:3)

对于遇到此问题并使用IIS7的其他任何人确保在<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"/>

我认为我的IgnoreRoute设置不正确,因为我收到了404错误。但是我遵循ActiveReports给出的教程,它在IIS6部分而不是IIS7中使用它们。