2008-09-30 35 views
5

我們使用MVC框架(版本5)和CrystalReportViewer控件來顯示我們的報告。我無法使報表查看器控件頂部的任何按鈕正常工作。CrystalReportViewer按鈕使用MVC框架破解

如果我正在處理報告'HoursSummary'。如果我將鼠標懸停在IE中報表查看器的任何按鈕上,頁面底部的顯示鏈接就是'../HoursSummary'。這會創建一個網址'http://localhost/HoursSummary'。沒有'HoursSummary'控制器,所以我一直收到404錯誤。

  • 我相信我想重定向到'http://localhost/reports/HoursSummary',因爲我確實有一個報告控制器。如果這是正確的方法,是否有人知道我應該在CrystalReportViewer控件上設置哪個屬性以實現此目的?
  • 有沒有更簡單的方法來處理這種情況?
+0

更新了VS2010和Crystal Reports 2010:http://stackoverflow.com/questions/3902195/asp-net-mvc-vs2010-crystal-reports-beta-2-cant-print-export-zoom-or-change -pa – ben 2010-10-21 20:59:30

+0

您是否可以預見爲什麼這可能不適用於使用MS reportviewer控件? – stan4th 2009-02-25 11:44:20

回答

3

我們能夠得到觀衆的報告工作,並一直在使用它在生產,過去幾個月沒有任何問題了。

  • 我們有一個報告,控制器,列出了指向我們想要的鏈接之一運行
  • 點擊將使一個AJAX調用後端和返回部分頁面,在這裏我們可以填寫所有的報告我們需要的參數。
  • 參數填寫完成後,我們將表格提交給'\ reports \報告名稱'。
  • 早在報告控制器,我們調用SQL,回報我們的數據,然後調用一個名爲「完整報告」不同的看法
  • 的「完整報告」僅查看上有一個水晶報表查看器控件它會自動執行報告數據,我們通過ViewData傳遞給它,填充報告,渲染併發送給用戶

一切似乎都很好。

UPDATE

我添加一些代碼和澄清,以我原來上面列出的步驟。我遺漏的關鍵項目是最後一個View有一些代碼,所以它可以與Crystal Reports一起使用。後面的代碼是最小的,但需要。 Crystal Reports的工作,你會用下列文件到結束:

  • 在您設計報表
  • 持有的Crystal Reports報表控件的aspx文件的佈局file.rpt。這是將有一些代碼隱藏的文件。

詳細瞭解如何創建一個視圖,將使用Crystal Reports:

  • 創建一個使用Crystal Reports設計報表的佈局。生成的文件將是一個.rpt文件。爲了這個例子,我們調用這個文件AllJobsSummaryReportLayout.rpt。
  • 在設計報表時,對於'數據庫字段',選擇一個業務實體或DTO,其中包含從SQL返回的結果。我們有一個簡單的例子,我們的系統中只包含一些數據傳輸對象(DTO),它們只包含標量值和字符串,但這些DTO中沒有智能。當控制器被調用時,它調用模型,大多數這些報告的模型返回一個DTO列表,然後我們將其傳遞給View以進行渲染。這些DTO不知道如何查詢自己,顯示自己,它們只包含從SQL返回的實際值,然後其他人呈現。
  • 佈局Crystal Report文件一旦完成,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 Report佈局文件AllJobsSummaryReportLayout.rpt的一種類型。

  • 一旦我們創建我們設置了數據源的值的「報告」變量,我們需要的任何參數,以及高達捆綁項到ViewData的。

  • 現在我們來看看AllJobsSummaryView.aspx。這個文件有一個水晶報表查看器就可以了形式和隱藏文件代碼:

<%@ 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產生錯誤「您已超出管理員設置的最大報告數量trator「。

這種方法在生產環境中仍然工作了兩年多。

3

如果這是一個服務器控件,它不會工作。 ASP.NET MVC不使用任何回發,因此大多數webforms服務器控件不起作用。

您可以做的是將報表查看器嵌入到iFrame中,並將其輸出到您的MVC視圖中。 iframe可以指向MVC內容的以外的頁面,比如在名爲Legacy的子文件夾中。