Crystal Report 的报表查看器控件是服务器端控件,因此,当它是 MVC 视图页面的一部分时,它无法正常工作。因此,当我尝试打印或导出并导致回发时,我会不断看到页面刷新,而不是打印或导出。
此行为与我在 Visual Studio 2008 中使用的 ASP.NET MVC 版本 1 以及 VS2008 附带的 Crystal Reports 版本不同。在 VS2010 以及 Crystal Reports 2010 的 Beta 版中,报表查看器控件需要位于普通的旧 aspx 页面上,而不是 MVC 视图页面的一部分。
为了实现这一点,我采取了以下步骤,其中许多步骤与我之前在相关问题中使用的步骤相同,但我针对 VS2010 和 CrystalReports 2010 中看到的新行为对它们进行了调整:StackOverflow.com:使用 MVC 框架损坏 CrystalReportViewer 按钮
- 在我的控制器中,我对模型进行正确的调用以获取报告数据,
List<JobSummaryBody> body = model.GetJobSummaryBody(jobId, startDate, endDate);
JobSummaryByDate summary = new JobSummaryByDate();
注意:JobSummaryByDate是我设计报表时由Crystal Reports创建的数据类型,它是代码生成的。将其视为您设计的报告所需的所有数据。
summary.SetDataSource(body);
- 最后,我将报告数据存储在会话中,并执行 Response.Redirect 到包含 Crystal Reports Viewer 的 aspx 页面
Session["ReportData"] = summary;
Response.Redirect("~/CrystalReports/JobSummaryByDateView.aspx");
注意:我在项目中创建了一个名为“CrystalReports”的新顶级文件夹,实际上可以通过 URL 导航到该文件夹。
-
JobSummaryByDateView.asp 的源页面非常简单,添加了 Crystal Report Viewer,在本例中我给了它一个 Report Viewer 的 ID:
<CR:CrystalReportViewer ID="ReportViewer" runat="server" AutoDataBind="true"
EnableDatabaseLogonPrompt="False" EnableParameterPrompt="False"
ToolPanelView="None" HasDrilldownTabs="False" HasDrillUpButton="False"
HasSearchButton="False" HasToggleGroupTreeButton="False"
HasToggleParameterPanelButton="False" ReuseParameterValuesOnRefresh="True" />
- 最后,在代码隐藏页面上,我将 ReportViewer.ReportSource 设置为我在控制器中生成的报告数据:
protected void Page_Init(object sender, EventArgs e)
{
ReportViewer.ReportSource = Session["ReportData"];
}