質問

MVCフレームワーク(リリース5)とCrystalReportViewerコントロールを使用してレポートを表示しています。レポートビューアーコントロールの上部にあるボタンが機能しません。

レポート「HoursSummary」で作業している場合。 IEのレポートビューアーのいずれかのボタンにカーソルを合わせると、ページの下部に表示されるリンクは「../HoursSummary」です。これにより、 ' http:// localhost / HoursSummary 'のURLが作成されます。 「HoursSummary」コントローラーはないため、404エラーを受け取り続けます。

  • http:// localhost / reports / HoursSummary 」にリダイレクトしたいと思うレポートコントローラー。これが正しいメソッドである場合、それを実現するためにCrystalReportViewerコントロールに設定する必要があるプロパティは誰にもわかりませんか?
  • この状況に対処する簡単な方法はありますか?
役に立ちましたか?

解決 2

レポートビューアーを機能させることができ、過去数か月間、問題なくレポートビューアーを使用しています。

  • 実行するレポートへのリンクをリストするレポートコントローラーがあります
  • リンクの1つをクリックすると、バックエンドへのajax呼び出しが行われ、必要なすべてのパラメーターを入力できる部分的なページが返されます。
  • パラメータを入力した後、フォームを「\ reports \ Name of Report」に送信します。
  • Reportsコントローラーに戻り、SQLを呼び出してデータを返し、「Full Report」という別のビューを呼び出します
  • 「フルレポート」ビューには、Crystalレポートビューアーコントロールのみがあり、ViewDataを介して渡されるレポートデータを自動的に取得し、レポートにデータを入力し、レンダリングして、ユーザーに送信します

すべてがうまくいくようです。

更新

上記で最初にリストしたステップにいくつかのコードと説明を追加しました。私が省略した重要な項目は、最終ビューにいくつかのコードビハインドがあるため、Crystal Reportsで動作することです。コードビハインドは最小限ですが、必要です。 Crystal Reportsが機能するために、次のファイルが作成されます。

  • レポートをデザインするレイアウトfile.rpt
  • Crystal Reportsレポートコントロールを保持するaspxファイル。これは、いくつかのコードビハインドを持つファイルです。

Crystal Reportsで機能するビューの作成方法の詳細:

  • Crystal Reports Designerを使用してレポートのレイアウトを作成します。結果のファイルは.rptファイルになります。この例のために、このファイルをAllJobsSummaryReportLayout.rptと呼びましょう。
  • レポートの設計中に、「データベースフィールド」に対して、SQLから返される結果を保持するビジネスエンティティまたはDTOのいずれかを選択します。
  • さておき、システムにはスカラー値と文字列のみを含むデータ転送オブジェクト(DTO)がいくつかあります。これらのDTOにはインテリジェンスはありません。 Controllerが呼び出されると、Modelが呼び出され、これらのほとんどのレポートのModelはDTOのリストを返します。このリストは、レンダリングするビューに渡されます。これらのDTOは、自身のクエリ方法、表示方法を知らず、他の誰かがレンダリングするSQLから返された実際の値のみを含みます。
  • Crystal Reportファイルのレイアウト、AllJobsSummaryReportLayout.rptが完成したら、コントローラーを設計します。コントローラーでは、レポートの実行に必要なパラメーターを取得し、モデルを呼び出します。モデルは、コントローラーから下のスニペットに示すように、DTOのリストを返します。

    var reportViewData = model.AllJobsSummaryQuery(startDate, endDate);
    if (0 != reportViewData.Count())
    {
        var report = new AllJobsSummaryReportLayout();
        report.SetDataSource(reportViewData);
        report.SetParameterValue("startDate", startDate);
        report.SetParameterValue("endDate", endDate);
        ViewData["ReportData"] = report;
        returnView = "AllJobsSummaryView";
    }
    else
        returnView = "noReportView";
    return View(returnView);
    
  • ここでいくつかの項目に注意してください。上で作成したCrystal ReportレイアウトファイルAllJobsSummaryReportLayout.rptの一種である可変の「レポート」を作成しています。

  • 「レポート」変数を作成したら、データソースの値と必要なパラメーターを設定し、アイテムをViewDataにバンドルします。

  • では、AllJobsSummaryView.aspxを見てみましょう。このファイルには、Crystal Reportsビューアーとコードビハインドファイルを含むフォームがあります。

<%@ Page Title="All Jobs Summary Report" Language="C#" AutoEventWireup="true" CodeBehind="AllJobsSummaryView.aspx.cs" Inherits="V.Views.Reports.AllJobsSummaryView"%>     
<%@ Register Assembly="CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %> 
<form id="form1" runat="server">
<div>
<a href="/Reports" id="Report"><< Return to Report Main
    Page</a><br />
<CR:CrystalReportViewer ID="ReportViewer" runat="server" AutoDataBind="True" EnableDatabaseLogonPrompt="False"
    EnableParameterPrompt="False" HasCrystalLogo="False" DisplayGroupTree="False" 
    HasDrillUpButton="False" HasToggleGroupTreeButton="False" HasViewList="False" 
    HasSearchButton="False" EnableDrillDown="False" EnableViewState="True" 
    Height="50px" ReportSourceID="CrystalReportSource1" Width="350px" />    
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
    <Report FileName="AllJobsSummaryReportLayout.rpt">
    </Report>
</CR:CrystalReportSource>
</div>
</form>
  • ファイルの背後にあるコード:

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Web;
     using System.Web.Mvc;
    
     namespace V.Views.Reports
     {
        public partial class AllJobsSummaryView : ViewPage
        {
            protected void Page_Init(object sender, EventArgs e)
            {
                ReportViewer.ReportSource = ViewData["ReportData"];
            }
    
            protected void Page_Unload(object sender, EventArgs e)
            {
                ((AllJobsSummaryReportLayout)ViewData["ReportData"]).Close();
                ((AllJobsSummaryReportLayout)ViewData["ReportData"]).Dispose();
            }
        }
     }
    
  • Page_Unloadは重要です。これがないと、Crystal Reportsで「管理者が設定したレポートの最大数を超えました。」

  • によってエラーが生成されます。

この方法は、実稼働環境で2年以上も使用されています。

他のヒント

それがサーバーコントロールの場合、機能しません。 ASP.NET MVCはポストバックを使用しないため、ほとんどのWebフォームサーバーコントロールは機能しません。

できることは、レポートビューアーをiFrameに埋め込み、MVCビューに出力することです。 iframeは、MVCのものの外にあるページを指すことができます。たとえば、レガシーなどと呼ばれるサブフォルダー内です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top