13

私は今日、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>

みんなの助けてくれてありがとう!

4

2 に答える 2

10

これについて社内で調査した結果、次の解決策が見つかりました。通常、WebViewer をビューに追加できます。あなたの例では、複雑な低レベルの対話コードは必要ありません。代わりに、通常どおり aspx ビューに WebViewer を追加するだけです。このサンプルでは、​​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 によって使用される IHttpHandlers がいくつかあります。ハンドラーが機能していることを確認するには、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

于 2009-03-23T15:51:47.060 に答える
3

この問題があり、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のチュートリアルに従っていました。

于 2011-01-28T23:27:27.047 に答える