MVCReportViewer错误加载子报告

时间:2015-07-20 01:08:09

标签: asp.net-mvc-4 reporting-services

我有一个使用MVCReportViewer加载报告的MVC4应用程序,但子报告未加载并返回此错误:

Data retrieval failed for the subreport, 'Actions', 
located at: C:\Projects\Report\ReportActions.rdlc. 
Please check the log files for more information.

这是我的观看代码:

@using Microsoft.Reporting.WebForms;
@using MvcReportViewer;
@using MvcReportViewer
@model ViewReport

@Html.MvcReportViewerFluent(Model.ReportPathTordlc).ProcessingMode(ProcessingMode.Local).LocalDataSource(Model.ReportDataSet, Model.Report).LocalDataSource(Model.ActionDataSet, Model.Actions).Attributes(new { Height = 900, Width = 800, style = "border: 2px solid #ddd" }).Method(FormMethod.Post);

两个.rdlc文件的路径都是正确的,因为我在加载视图之前在控制器上检查它。

reportPathTordlc显示正确, 我有一个要检查的参数,所以在我的report.rdlc中我插入了带参数的子报表。在子报表上,我创建了一个参数。但仍未显示子报告。

C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\LogFiles的日志文件中,如果没有显示任何错误,则只显示以下内容:i INFO: Call to CleanBatch()

到处搜索,但还没有运气。

来自here

的项目

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

经过大量研究,我终于找到了解决方案:

它不是最优雅的方式,但工作正常。

所以要完成:

在控制器中:

// Init new DataTable
DataTable dt = new DataTable();
// Assign the data for Subreport
dt = dataToLoadInSubReport();
// Place it in Session
Session["dataToLoadInSubReport"] = dt;

在视图中:

// Remove the subreport .LocalDataSource, keep the Parent Report
@Html.MvcReportViewerFluent("~/Report/report.rdlc").ProcessingMode(ProcessingMode.Local).LocalDataSource("ReportDataSet", ReportDataTable).Method(FormMethod.Post);

在MvcReportViewer中:

// Html head (Added the script below)
<script runat="server">
    void SubSubreportProcessing(object sender, SubreportProcessingEventArgs e)
    {
        // Check if Session is not null
        if (Session["dataToLoadInSubReport"] != null)
        {
            // Get data in Session  
            System.Data.DataTable dt = Session["dataToLoadInSubReport"] as System.Data.DataTable;
            // Convert to dataview to filter
            System.Data.DataView dv = new System.Data.DataView(dt);
            if (dv != null)
            {
                // Get Subreport parameter
                var param1 = Convert.ToInt32(e.Parameters[0].Values[0]);
                // Filter DataView
                dv.RowFilter = "ID = " + param1;
                // Add Filtered DataView to DataSource specified in the Subreport rdlc file
                e.DataSources.Add(new ReportDataSource("DTSubReport", dv));
            }              
        }
    }

    protected void ReportViewer_PreRender(object sender, EventArgs e)
    {
        ReportViewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubSubreportProcessing);
    }
</script>
//Html body (add new attribute OnPreRender="")
<rsweb:ReportViewer ID="ReportViewer" ClientIDMode="Predictable" runat="server" OnPreRender="ReportViewer_PreRender"></rsweb:ReportViewer>

父级应该按照MVCReportViewer中的描述工作,这是为了使子报告工作在一起。

希望这能帮到那里的人。

干杯