当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在ASP.NETMVC中呈现ActiveReportsWebViewer》经验,为你挑选了1个好方法。

我今天早些时候在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"%>


    <%=ViewData["WebViewer"] %>

错误:

你调用的对象是空的.描述:执行当前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;
%>

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

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

我最终使用了这里找到的答案:替代在ASP.Net MVC视图中使用OnLoad事件?结合斯科特的优秀答案如下.将报告生成并绑定到控件是时间问题.所以我的View最终看起来像这样......(其中Model.Report是一个ActiveReport3)




    

谢谢大家的帮助!



1> Scott Willek..:

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


这足以让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路由似乎只允许这样一个"全部捕获"路由.因此,如果您有多个这些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

Scott Willeke
数据动态/ GrapeCity

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有