我今天早些时候在DataDynamics论坛中提出了这个问题。我认为也许我会在SO上得到某种回应。
我试图在我的ASP.NET MVC应用程序中启动并运行WebViewer。
我试图在 Controller 中渲染Webviewer(webViewer.RenderControl(htmlTextWriter),然后将结果放入ViewData并在我的 View 中显示报告。我什至不知道这是否是解决此问题的正确方法。将不胜感激。
Controller 代码:
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的回答(谢谢),我的 Controller 现在看起来像这样:
public ActionResult Display()
{
ViewData["Report"] = new DetailedReport { ReportData = new DetailedReport { ReportData = new DetailedData() { Repository = _repository } };
return View();
}
我的 View 如下所示:(我的 View 文件后面没有代码)。
<%
var report = (ActiveReport3) ViewData["Report"];
report.Run();
WebViewer1.Report = report;
%>
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />
我看着它通过调试器,它似乎正确地执行了“详细信息”部分,将值放入了我的字段中。但是,在完成所有操作后,我收到消息“未指定报告”。 我希望我真的不必在 View 上使用代码隐藏文件,因为我没有在其他任何地方使用它们。我还调试了该代码,以确保report.Document.Pages.Count>0。我已将代码块放在WebViewer控件的上方和下方(不要认为这真的很重要)。还有其他想法吗?
****更新#2:****
我最终使用了在这里找到的答案:Alternative to using the OnLoad event in an ASP.Net MVC View?和下面的scott出色答案。生成报表并将其绑定(bind)到控件是一项时机。所以我的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>
感谢大家的帮助!
最佳答案
我们在内部进行了调查,找到了以下解决方案。您可以正常地将WebViewer添加到 View 中。在您的示例中,不需要复杂的低级交互代码。相反,只需将WebViewer正常添加到您的aspx View 即可。在我们的示例中,WebViewer的添加如下:
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />
这足以使WebViewer在 View 上工作。
在 Controller 中,我们指定了一个ActiveReport,如下所示:
ViewData["Report"] = new SampleReport();
在 View 的代码背后,我们将报表挂接到 View :
WebViewer1.Report = ViewData["Report"] as ActiveReport3;
然后,棘手的部分开始了。在ASP.NET下运行时,ActiveReports使用某些IHttpHandler来处理某些查看器类型,例如AcrobatReader/PDF。为确保我们的处理程序正常工作,您必须获取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从我们的论坛下载完整样本。
斯科特·威勒克
数据动力学/GrapeCity