代码之家  ›  专栏  ›  技术社区  ›  ben

使用MVC框架破坏CrystalReportViewer按钮

  •  5
  • ben  · 技术社区  · 16 年前

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

    如果我正在处理“小时摘要”报告。如果将鼠标悬停在IE中报表查看器上的任何按钮上,则页面底部显示的链接为“../HoursSummary”。这将创建一个' http://localhost/HoursSummary

    • 我相信我想重定向到' http://localhost/reports/HoursSummary '因为我有一个报告控制器。如果这是正确的方法,有人知道我应该在CrystalReportViewer控件上设置哪个属性来实现这一点吗?
    2 回复  |  直到 16 年前
        1
  •  3
  •   Ben Scheirman    16 年前

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

    您可以将报表查看器嵌入到iFrame中,并将其输出到MVC视图中。iframe可以指向一个页面

        2
  •  3
  •   ben    15 年前

    我们能够让报表查看器正常工作,并且在过去几个月的生产中一直在使用它,没有出现任何问题。

    • 我们有一个报告控制器,它列出了指向要运行的报告的链接
    • 单击其中一个链接将对后端进行ajax调用,并返回一个部分页面,在该页面中我们可以填写所需的所有参数。
    • 填写完参数后,我们将表单提交到“\reports\Name of Report”。
    • 回到报表控制器中,我们调用SQL,返回数据,然后调用另一个称为“完整报表”的视图
    • “完整报告”视图上只有一个crystal Report viewer控件,它自动获取我们通过ViewData传递给它的报告数据,填充报告,呈现报告,并将其发送给用户

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

    • 设计报告的布局文件.rpt
    • 保存Crystal Reports控件的aspx文件。这是将有一些代码隐藏的文件。

    有关如何创建可用于Crystal Reports的视图的详细信息:

    • 使用Crystal Reports Designer创建报告的布局。生成的文件将是一个.rpt文件。在本例中,我们将此文件称为AllJobsSummaryReportLayout.rpt。
    • 在设计报表时,为“数据库字段”选择一个业务实体或DTO,该实体或DTO保存从SQL返回的结果。
    • 简单地说,我们的系统中有一些数据传输对象(DTO),它们只包含标量值和字符串,这些DTO中没有智能。当控制器被调用时,它调用模型,大多数报告的模型返回一个DTO列表,然后我们将其传递给要呈现的视图。这些DTO不知道如何查询自己、显示自己,它们只包含其他人随后呈现的SQL返回的实际值。
    • 完成布局水晶报告文件AllJobsSummaryReportLayout.rpt后,我们设计控制器。在控制器中,我们获取运行报告所需的任何参数,调用模型,模型返回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报告布局文件AllJobsSummaryReportLayout.rpt的一种类型。

    • 现在让我们来看一看ALOJOSSReMyVIEW.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();
              }
          }
       }
      
    • 页面_Unload是键,如果没有它,Crystal Reports将生成一个错误“您已超过管理员设置的最大报告数”

    这种方法在生产环境中仍然有效两年多了。