【发布时间】: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