0

最近、Visual Studio 2010 を使用して MVC アプリケーションに初めての RDLC レポートを作成しました。

Report Wizard を使用して Report1.rdlc を作成し、次のコントローラー コードを実行して出力を PDF にレンダリングしました。

レポート実行時のデータ ソースは、モデル内のサイト オブジェクトを参照します。すべて正常に実行されますが、出力の 4 列のうち 2 列が #Error としてレンダリングされます

両方の列にすべてのレコードのデータがあり、null はありません

2 つの #Error 列がレンダリングされる列と異なる唯一の点は、それらがモデルの 1 レベル下にあることです。つまり、4つの列のうち:

1 番目のフィールド SiteDescription は OK をレンダリングします 2 番目のフィールド SiteOperator は各行の値を #Error としてレンダリングします 3 番目のフィールド SiteStatus は各行の値を #Error としてレンダリングします 4 番目のフィールド CapacityMW は OK をレンダリングします

注意: SiteOperator は Site.SiteOperator.Operator です。3 番目のフィールドについても同様です。1 番目と 4 番目は、Site テーブルのフィールドです (つまり、この場合はモデルのトップ レベル)。

質問: RDLC がモデルの既存のオブジェクトを操作できるようにするために開発者がしなければならないことは他にありますか? つまり、レポート ウィザードが Report1.rdlc.xml ファイルを作成することに気付きました。おそらくこれを変更する必要があります。これに関するアイデアが尽きてしまいました。どんなコメントでも大歓迎です

これが私のコントローラーコードです:

        private void RenderReport(string ReportPath, object Model)
    {

        var localReport = new LocalReport { ReportPath = ReportPath };

        var reportDataSource = new ReportDataSource("DataSet1", Model);
        localReport.DataSources.Add(reportDataSource);

        var reportType = "PDF";
        string mimeType;
        string encoding;
        string fileNameExtension;

        //The DeviceInfo settings should be changed based on the reportType
        //http://msdn2.microsoft.com/en-us/library/ms155397.aspx
        string deviceInfo =
        "<DeviceInfo>" +
        "  <OutputFormat>PDF</OutputFormat>" +
        "  <PageWidth>8.5in</PageWidth>" +
        "  <PageHeight>11in</PageHeight>" +
        "  <MarginTop>0.5in</MarginTop>" +
        "  <MarginLeft>1in</MarginLeft>" +
        "  <MarginRight>1in</MarginRight>" +
        "  <MarginBottom>0.5in</MarginBottom>" +
        "</DeviceInfo>";

        Warning[] warnings;
        string[] streams;
        byte[] renderedBytes;

        //Render the report
        renderedBytes = localReport.Render(
            reportType,
            deviceInfo,
            out mimeType,
            out encoding,
            out fileNameExtension,
            out streams,
            out warnings);

        //Clear the response stream and write the bytes to the outputstream
        //Set content-disposition to "attachment" so that user is prompted to take an action
        //on the file (open or save)
        Response.Clear();
        Response.ContentType = mimeType;
        Response.AddHeader("content-disposition", "attachment; filename=foo." + fileNameExtension);
        Response.BinaryWrite(renderedBytes);
        Response.End();
    }
4

3 に答える 3

0

レポートをうまく機能させることができました。ストアド プロシージャを使用してコントローラーから呼び出すように切り替えました。RDLC ファイルをビューに配置し、直接 PDF にレンダリングしました。MVCアプリでルーティングに触れる必要がなく、コントロールなどを含むASP.NETページを追加する必要がなかったので、これに本当に満足しています.非常にきれいでクリーンなソリューション.

于 2012-07-31T05:58:44.853 に答える
0

Entity Framework (POCO オブジェクト テンプレートを使用) によって生成された C# クラスに由来するモデルを使用して、MVC で RDLC を使用します。

現在、私のクラスは、プロパティ (nullables、数値、文字列、DateTimes など) のみを持ち、他のオブジェクトのコレクションを持たない比較的「フラットな」クラスであるため、違いが生じる可能性があります。

ウィザードを使用せずに RDLC を作成しましたが、MVC のデザイナーで作成するには、デザイナーが機能するようにプロジェクトに .aspx を追加する必要があることがわかりました。また、レポート データ ソース ウィザードなどで使用するために使用する型の IEnumerables を返すモック クラスに、パブリックな静的メソッドがあります。

また、EF を使用してデータを入力するので、ストアド プロシージャは絶対に必要ありません。

var data = dal.PrintFriendlies.Where( p => p.ApplicationId == applicationId );
viewer.LocalReport.DataSources.Add( new ReportDataSource( "DataSourceName" , data ) );

また、PDF バイトを返すので、コードは私が使用するものと非常によく似ています (データソースとパラメーターの両方、およびサブレポートを使用します)。

クラス構造がどのようなものかについては説明していませんが、階層構造に問題があると思うので、レポート作成者が好むものにフラット化する必要があるかもしれません。

于 2012-07-30T17:08:50.570 に答える
0

RDLC で "#Error" 応答を受け取ったときに最初に確認するのは、Visual Studio の [出力/デバッグ] タブです。これには、レポートのレンダリング中にレポート エンジンが受け取ったエラーごとに特定のエラー メッセージが表示されます。常に世界で最も直感的なメッセージであるとは限りませんが、少なくとも正しい方向に向ける必要があります.

于 2012-07-25T16:37:54.920 に答える