我们正在使用MVC框架(第5版)和CrystalReportViewer控件来显示我们的报告。我无法使报表查看器控件顶部的任何按钮生效。
如果我正在使用报告'HoursSummary'。如果我将鼠标悬停在IE浏览器查看器上的任何按钮上,则页面底部显示的链接为“../HoursSummary”。这会创建一个“http://localhost/HoursSummary”的网址。没有'HoursSummary'控制器,所以我一直收到404错误。
答案 0 :(得分:3)
如果这是服务器控件,它将无法正常工作。 ASP.NET MVC不使用任何回发,因此大多数webforms服务器控件都不起作用。
您可以做的是将报表查看器嵌入到iFrame中并将其输出到MVC视图中。 iframe可以指向MVC内容的页面 ,例如在名为Legacy的子文件夹中。或者
。答案 1 :(得分:3)
我们能够让报告查看器工作,并且在过去几个月中一直在使用它而没有任何问题。
一切似乎都很有效。
更新
我在上面列出的步骤中添加了一些代码和说明。我遗漏的关键项目是最终View后面有一些代码,因此它可以与Crystal Reports一起使用。背后的代码很少,但需要。要使Crystal Reports正常工作,您最终将得到以下文件:
有关如何创建将与Crystal Reports一起使用的视图的详细信息:
完成布局Crystal Report文件后,AllJobsSummaryReportLayout.rpt,我们设计了Controller。在Controller中,我们接受运行报告所需的任何参数,调用Model,Model返回我们的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的一种类型。
创建'report'变量后,我们设置数据源值和我们需要的任何参数,并将项目捆绑到ViewData中。
现在让我们来看看AllJobsSummaryView.aspx。此文件上有一个表单,其中包含Crystal Reports Viewer和代码隐藏文件:
<%@ 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会生成错误您已超出管理员设置的最大报告数。'
此方法目前仍在生产环境中工作两年多。