MVCフレームワークを使用して壊れたCrystalReportViewerボタン
-
03-07-2019 - |
質問
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のものの外にあるページを指すことができます。たとえば、レガシーなどと呼ばれるサブフォルダー内です。