私は今日、DataDynamicsフォーラムでこの質問をしました。ここSOでなんらかの反応があるのではないかと思いました。
ASP.NETMVCアプリケーションで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:****
私はここで見つけた答えを使用することになりました:ASP.Net MVCビューでOnLoadイベントを使用する代わりに?以下のスコットの優れた答えと組み合わせて。これは、レポートを生成してコントロールにバインドするタイミングでした。したがって、私のビューは最終的に次のようになります...(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>
みんなの助けてくれてありがとう!