2015-07-20 50 views
0

我必须使用MVCReportViewer加载报告一个MVC4应用程序,但是子报表没有加载并返回该错误:MVCReportViewer错误加载子报表

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

任何帮助,将不胜感激。

回答

0

了大量的研究后,我终于找到了一个解决方案:

它不是最优雅的方式,但效果还算不错。

因此得到完成:

在控制器:

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

在View:

// 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> 

家长应为工作描述MVCRepo rtViewer,这是为了使子报告一起工作。

希望这可以帮助那里的人。

干杯