Domanda

Stiamo usando il framework MVC (versione 5) e il controllo CrystalReportViewer per mostrare i nostri report. Non riesco a far funzionare nessuno dei pulsanti nella parte superiore del controllo visualizzatore di report.

Se sto lavorando con il rapporto "HoursSummary". Se passo con il mouse su uno dei pulsanti del visualizzatore di report in IE, il link visualizzato nella parte inferiore delle pagine è "../HoursSummary". Questo crea un URL di " http: // localhost / HoursSummary ". Non esiste un controller "HoursSummary", quindi continuo a ricevere errori 404.

  • Credo di voler reindirizzare a " http: // localhost / reports / HoursSummary 'poiché un controller di report. Se questo è il metodo corretto qualcuno sa quale proprietà dovrei impostare sul controllo CrystalReportViewer per farlo accadere?
  • Esiste un metodo più semplice per gestire questa situazione?
È stato utile?

Soluzione 2

Siamo stati in grado di far funzionare il visualizzatore di report e lo abbiamo utilizzato negli ultimi mesi in produzione senza problemi.

  • Abbiamo un controller di report che elenca i collegamenti ai report che vogliamo eseguire
  • Facendo clic su uno dei collegamenti verrà effettuata una chiamata Ajax al back-end e verrà restituita una pagina parziale in cui possiamo compilare tutti i parametri di cui abbiamo bisogno.
  • Dopo aver compilato i parametri, inviamo il modulo a "\ reports \ Name of Report".
  • Tornando al controller Rapporti chiamiamo SQL, restituiamo i nostri dati e quindi chiamiamo una vista diversa chiamata "Rapporto completo"
  • La vista 'Rapporto completo' ha solo un controllo visualizzatore di rapporti di cristallo su di essa dove prende automaticamente i dati del rapporto che gli passiamo attraverso ViewData, popola il rapporto, lo rende e lo invia all'utente

Tutto sembra funzionare alla grande.

UPDATE

Ho aggiunto un po 'di codice e chiarimenti ai passaggi che ho elencato in precedenza. L'elemento chiave che ho lasciato fuori era che c'è un po 'di codice dietro con la vista finale, quindi funzionerà con Crystal Reports. Il codice dietro è minimo, ma necessario. Per far funzionare Crystal Reports, finirai con i seguenti file:

  • Un layout file.rpt in cui si progetta il report
  • Un file aspx che contiene il controllo Crystal Reports Report. Questo è il file che avrà un po 'di codice dietro.

Dettagli su come creare una vista che funzionerà con Crystal Reports:

  • Crea il layout del rapporto utilizzando Crystal Reports Designer. Il file risultante sarà un file .rpt. Per il bene di questo esempio, chiamiamo questo file AllJobsSummaryReportLayout.rpt.
  • Durante la progettazione del report, per "Campi database" selezionare una delle entità aziendali o DTO che contiene i risultati provenienti da SQL.
  • A parte ciò, nel nostro sistema abbiamo alcuni oggetti di trasferimento dati (DTO) che non contengono nient'altro che valori e stringhe scalari, non c'è intelligenza in questi DTO. Quando viene chiamato il controller, chiama il modello, il modello per la maggior parte di questi report restituisce un elenco di DTO che passiamo quindi alla vista per il rendering. Questi DTO non sanno come interrogarsi, mostrarsi, contengono solo i valori effettivi restituiti da SQL che qualcun altro esegue quindi il rendering.
  • Una volta completato il file Crystal Report di layout, AllJobsSummaryReportLayout.rpt, progettiamo il nostro controller. Nel controller prendiamo in considerazione tutti i parametri necessari per eseguire il report, chiamiamo il modello, il modello restituisce il nostro elenco di DTO, come mostrato nello snippet di seguito dal controller:

    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);
    
  • Nota un paio di elementi qui, stiamo creando un 'report' variabile che è un tipo del file di layout di Crystal Report, AllJobsSummaryReportLayout.rpt, che abbiamo creato sopra.

  • Dopo aver creato la variabile 'report', impostiamo i valori dell'origine dati e tutti i parametri di cui abbiamo bisogno e raggruppiamo l'elemento in ViewData.

  • Ora diamo un'occhiata a AllJobsSummaryView.aspx. Questo file ha un modulo su di esso con un Crystal Reports Viewer e un codice dietro il file:

<%@ 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>
  • E il codice dietro il file:

     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 è la chiave, senza di essa si genererà un errore generato da Crystal Reports "Hai superato il numero massimo di rapporti impostato dal tuo amministratore."

Questo metodo funziona ancora in un ambiente di produzione da oltre due anni ormai.

Altri suggerimenti

Se si tratta di un controllo server, non funzionerà. ASP.NET MVC non utilizza alcun postback, quindi la maggior parte dei controlli del server webform non funziona.

Quello che puoi fare è incorporare il visualizzatore di report in un iFrame e visualizzarlo nella vista MVC. L'iframe può puntare a una pagina esterna delle cose MVC, diciamo in una sottocartella chiamata Legacy o qualcosa del genere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top