ASP.NET MVC で Active Report WebViewer をレンダリングする方法
-
21-08-2019 - |
質問
私は今日初めに DataDynamics フォーラムでこの質問をしました。ここSOで何らかの返答が得られるかもしれないと思った。
ASP.NET MVC アプリケーションで WebViewer を起動して実行しようとしています。コントローラー (webViewer.RenderControl(htmlTextWriter)) で Web ビューアーをレンダリングし、結果を 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 = 新しい HtmlTextWriter(stringWriter);61行目:webViewer.RenderBeginTag(htmlTextWriter);62行目:webViewer.RenderControl(htmlTextWriter);63行目:webViewer.RenderEndTag(htmlTextWriter);64行目:
ソースファイル:C:\Projects\xxxx\xxxx\app\xxxx.Web.Controllers eportsController.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 イベントを使用する代わりに? 以下の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>
みんなの助けに感謝します!
解決
この問題を社内で調査した結果、次の解決策が見つかりました。WebViewer は通常どおりビューに追加できます。この例では、複雑な低レベルの対話コードは必要ありません。代わりに、WebViewer を通常どおり aspx ビューに追加するだけです。このサンプルでは、WebViewer が次のように追加されました。
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />
WebViewer をビュー上で動作させるにはこれで十分です。
コントローラーでは次のように ActiveReport を指定しました。
ViewData["Report"] = new SampleReport();
ビューのコードビハインドで、レポートをビューにフックします。
WebViewer1.Report = ViewData["Report"] as ActiveReport3;
それからトリッキーな部分が始まります。AcrobatReader/PDFなどの一部のビューアタイプでは、ASP.NETで実行する場合にActiveReportsで使用されるIHttpHandlerがいくつかあります。ハンドラーが動作していることを確認するには、通常どおり処理できるように ASP.NET MVC ルーティングを取得する必要があります。幸いなことに、それは簡単です。次のコード行を Global.asax.cs ファイルに追加するだけです。
routes.IgnoreRoute("{*allarcachitems}", new { allarcachitems = @".*\.ArCacheItem(/.*)?" });
それはルートを無視します。私の読んだところによると、ASP.NET ルーティングではこのような「キャッチオール」ルートが 1 つしか許可されないようなので、問題が発生する可能性があることに注意してください。したがって、これらの 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
スコット・ウィリーク
データダイナミクス / グレープシティ
他のヒント
この問題が発生し、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"/>
404 エラーが発生したため、IgnoreRoute の設定が不適切だったのかと思いました。ただし、IIS7ではなくIIS6セクションにあるActiveReportsによって提供されるチュートリアルに従っていました。