CrystalReportViewer按钮使用MVC框架破坏

时间:2008-09-30 19:57:43

标签: asp.net-mvc crystal-reports

我们正在使用MVC框架(第5版)和CrystalReportViewer控件来显示我们的报告。我无法使报表查看器控件顶部的任何按钮生效。

如果我正在使用报告'HoursSummary'。如果我将鼠标悬停在IE浏览器查看器上的任何按钮上,则页面底部显示的链接为“../HoursSummary”。这会创建一个“http://localhost/HoursSummary”的网址。没有'HoursSummary'控制器,所以我一直收到404错误。

  • 我相信我想重定向到'http://localhost/reports/HoursSummary',因为我有一个报告控制器。如果这是正确的方法,是否有人知道我应该在CrystalReportViewer控件上设置哪个属性来实现呢?
  • 有没有更简单的方法来处理这种情况?

2 个答案:

答案 0 :(得分:3)

如果这是服务器控件,它将无法正常工作。 ASP.NET MVC不使用任何回发,因此大多数webforms服务器控件都不起作用。

您可以做的是将报表查看器嵌入到iFrame中并将其输出到MVC视图中。 iframe可以指向MVC内容的页面 ,例如在名为Legacy的子文件夹中。或者

答案 1 :(得分:3)

我们能够让报告查看器工作,并且在过去几个月中一直在使用它而没有任何问题。

  • 我们有一个报告控制器,列出了我们要运行的报告的链接
  • 点击其中一个链接会对后端进行ajax调用并返回一个部分页面,我们可以填写所需的所有参数。
  • 参数填写完毕后,我们将表格提交至'\ reports \ Report of Report'。
  • 返回Reports控制器,我们调用SQL,返回我们的数据,然后调用另一个名为“Full Report”的视图
  • “完整报告”视图上只有一个水晶报表查看器控件,它会自动获取我们通过ViewData传递给它的报表数据,填充报表,呈现它并将其发送给用户

一切似乎都很有效。

更新

我在上面列出的步骤中添加了一些代码和说明。我遗漏的关键项目是最终View后面有一些代码,因此它可以与Crystal Reports一起使用。背后的代码很少,但需要。要使Crystal Reports正常工作,您最终将得到以下文件:

  • 您设计报告的布局file.rpt
  • 包含Crystal Reports报表控件的aspx文件。这是将有一些代码的文件。

有关如何创建将与Crystal Reports一起使用的视图的详细信息:

  • 使用Crystal Reports设计器创建报告的布局。生成的文件将是.rpt文件。为了这个例子,让我们调用这个文件AllJobsSummaryReportLayout.rpt。
  • 在设计报表时,对于“数据库字段”,选择一个包含从SQL返回的结果的业务实体或DTO。
  • 除此之外,我们系统中有一些数据传输对象(DTO),它们只包含标量值和字符串,这些DTO中没有智能。当调用Controller时,它调用Model,大多数这些报告的Model返回一个DTO列表,然后我们将其传递给要渲染的View。这些DTO不知道如何查询自己,显示自己,它们只包含从其他人随后呈现的SQL返回的实际值。
  • 完成布局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会生成错误您已超出管理员设置的最大报告数。'

此方法目前仍在生产环境中工作两年多。