2008-09-30 15 views
5

Estamos utilizando el marco MVC (versión 5) y el control CrystalReportViewer para mostrar nuestros informes. No puedo hacer que funcione ninguno de los botones en la parte superior del control del visor de informes.Botones CrystalReportViewer rotos mediante MVC Framework

Si estoy trabajando con el informe 'HoursSummary'. Si coloco el cursor sobre cualquiera de los botones en el visor de informes en IE, el enlace que se muestra en la parte inferior de las páginas es '../HoursSummary'. Esto crea una url de 'http://localhost/HoursSummary'. No hay un controlador 'HoursSummary' así que sigo recibiendo errores 404.

  • creo que quiero volver a dirigir a 'http://localhost/reports/HoursSummary' desde que tienen un controlador de informes. Si este es el método correcto, ¿alguien sabe qué propiedad debo configurar en el control CrystalReportViewer para que esto suceda?
  • ¿Existe un método más sencillo para manejar esta situación?
+0

Actualizado para VS2010 y Crystal Reports 2010: http://stackoverflow.com/questions/3902195/asp-net-mvc-vs2010-crystal-reports-beta-2-cant-print-export-zoom-or-change -pa – ben

+0

¿Puede prever alguna razón por la cual esto podría no aplicarse al uso del control del visor de informes MS? – stan4th

+0

Probé el visor de informes MS, pero por alguna razón nunca funcionó del todo bien. Sin embargo, también tuve Crystal Reports trabajando en este punto y nunca lo llevé a cabo. – ben

Respuesta

3

Pudimos hacer que el visor de informes funcionara y lo hemos estado usando durante los últimos meses en producción sin ningún problema.

  • Tenemos un controlador de informes que las listas de enlaces a los informes que desea ejecutar
  • Al hacer clic en uno de los enlaces hará una llamada AJAX a la parte de atrás y devolver una parte de la página donde podemos llenar toda los parámetros que necesitamos
  • Después de completar los parámetros, enviamos el formulario a '\ reports \ Name of Report'.
  • De vuelta en el controlador de Informes llamamos a SQL, devolvemos nuestros datos, y luego llamamos a una vista diferente llamada 'Informe completo'
  • La vista 'Informe completo' solo tiene un control de visor de informes de cristal donde toma automáticamente el informar los datos que le pasamos a través de ViewData, rellena el informe, lo renderiza y lo envía al usuario

Todo parece funcionar muy bien.

ACTUALIZACIÓN

he añadido algo de código y la clarificación de los pasos que se enumeran más arriba originalmente. El elemento clave que dejé fue que hay algún código detrás con la Vista final, por lo que funcionará con Crystal Reports. El código detrás es mínimo, pero necesario. Para Crystal Reports para trabajar se va a terminar con los siguientes archivos:

  • Un diseño file.rpt donde se diseña el informe
  • Un archivo aspx que mantiene el control de Crystal Reports Informe. Este es el archivo que tendrá algún código detrás.

detalles sobre cómo crear una vista que va a trabajar con Crystal Reports:

  • crear el diseño del informe mediante el Diseñador de Crystal Reports. El archivo resultante será un archivo .rpt. Por el bien de este ejemplo, llamemos a este archivo AllJobsSummaryReportLayout.rpt.
  • Al diseñar su informe, para los 'Campos de la base de datos', seleccione una de las entidades comerciales o DTO que contiene los resultados provenientes de SQL.
  • Dejando a un lado, tenemos algunos objetos de transferencia de datos (DTO) en nuestro sistema que no contienen nada más que valores escalares y cadenas, no hay inteligencia en estos DTO. Cuando se llama al Controlador, llama al Modelo, el Modelo para la mayoría de estos informes devuelve una Lista de DTO que luego pasamos a la Vista que se va a representar. Estos DTO no saben cómo autoexplicarse, mostrarse a sí mismos, solo contienen los valores reales devueltos desde SQL que luego alguien más representa.
  • Una vez que se completa el archivo del informe de Crystal Reports, AllJobsSummaryReportLayout.rpt, diseñamos nuestro controlador. En el controlador que tomamos en los parámetros necesarios para ejecutar el informe, llame a la Modelo, Modelo vuelve nuestra lista de dtos, como se ve en el siguiente fragmento de código del controlador:

    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 par de artículos que aquí, estamos creando un 'informe' variable que es un tipo del archivo de diseño de Informe de Crystal, AllJobsSummaryReportLayout.rpt, que creamos anteriormente.

  • Una vez que creamos la variable 'informe', establecemos los valores de fuente de datos y cualquier parámetro que necesitemos, y agrupamos el elemento en ViewData.

  • Ahora echemos un vistazo a AllJobsSummaryView.aspx. Este archivo tiene una forma en él con un visor de Crystal Reports y un código detrás de archivo:

<%@ 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> 
  • Y el código detrás de archivo:

    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(); 
         } 
        } 
    } 
    
  • El La carga de página es la clave, sin ella tendrá un error generado por Crystal Reports. Ha excedido el número máximo de informes establecidos por su administrador. trator. '

Este método todavía funciona en un entorno de producción desde hace más de dos años.

+0

Estoy tratando de hacer esto ben. En su último paso dice que tiene una Vista con CrystalReportViewer en ella. Parece que no puedo hacer que esto funcione correctamente sin código subyacente. ¿Puedes dar más detalles y un vistazo a tu código de vista? – Craig

3

Si eso es un control de servidor, no funcionará. ASP.NET MVC no utiliza ninguna devolución de datos, por lo que la mayoría de los controles del servidor de formularios web no funcionan.

Lo que puede hacer es incrustar el visor de informes en un iFrame y generarlo en su vista de MVC. El iframe puede apuntar a una página fuera de del material MVC, por ejemplo, en una subcarpeta llamada Legacy o algo así.