2011-08-06 46 views
9

Estoy construyendo una aplicación web ASP.NET MVC3 y quiero crear algunos informes utilizando informes de cristal y mostrarlos mediante el visor de informes de cristal. Busqué en la web y no encontré ninguna forma sólida de hacerlo en una aplicación web MVC3. ¿Tiene alguna sugerencia/idea de cómo hacerlo?Crystal Reports Viewer con MVC3

Respuesta

4

Si no te importa hackear, en realidad es bastante fácil. (Asumiendo CR4VS2010)

Primero agregue una página de WebForms a su proyecto y agregue el control del visor de informes de cristal a ella.

verificarlo añadido referencias a las:

CrystalDescisions.CrystalReports.Engine, CrystalDescisions.ReportSource, CrystalDescisions.Shared, y CrystalDescisions.Web.

A continuación, agregue un PageRoute a su aplicación que conduce a la página recién agregada.

Por último, y este fue el mayor dolor en BLANCO, tendrá que hacer que Crystal's Image Handler funcione. Hay muchas maneras de supuestos, tanto alrededor de la red y aquí en SO, ninguno de ellos realmente trabajó para mí, así que recurrí a engaño:

public class CrystalImageHandlerController : Controller 
{ 
    // 
    // GET: /CrystalImageHandler.aspx 

    public ActionResult Index() 
    { 
     return Content(""); 
    } 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 

     var handler = new CrystalDecisions.Web.CrystalImageHandler(); 
     var app = (HttpApplication)filterContext.RequestContext.HttpContext.GetService(typeof(HttpApplication)); 
     if (app == null) return; 

     handler.ProcessRequest(app.Context); 

    } 
} 

añadir una ruta a este controlador como /CrystalReportsImageHandler.aspx, aquí es donde CR espera que sea controlador. Esto también se puede usar en Áreas, simplemente cambie las rutas del navegador y de la página según sea necesario.

Tenga en cuenta que no podrá usar sus diseños Razor. Por lo tanto, deberá recurrir a otros medios para obtener continuidad visual. (Utilicé IFrames)

+0

Gracias. Obtuve la parte Webform de [aquí] (http://www.highoncoding.com/Articles/550_Creating_Crystal_Report_in_ASP_NET.aspx) y al combinarla con su controlador logré ver mi informe. –

+0

¡Genial! También debería activar este tidbit: cuando se usa el visor web, tiene una API JS en el navegador. No he encontrado ninguna documentación en él, pero cuando lo hice funcionar con el diseño de mi sitio, usando iframes, descubrí que su método de cambio de tamaño era invaluable. El nombre de los objetos es _UI. –

+0

Usted menciona: "Agregue una ruta a este controlador como/CrystalReportsImageHandler.aspx". ¿Cómo exactamente hago esto? –

4

En nuestros proyectos estamos devolviendo el informe directamente en formato PDF. Decidimos no usar ambos WebForms y MVC en el mismo proyecto, principalmente debido a mantener la base de código limpia.

Los informes se generan contra un conjunto de datos "tonto" creado manualmente y con datos llenos por una clase de servicio que retiró toda la información necesaria a través de NHibernate (porque estamos usando una capa de persistencia ORM y abstracción de base de datos, Crystal Reports no debe conectarse directamente a la base de datos).

Si el proyecto no tiene la necesidad de mostrar el informe en el navegador como un "modo de vista previa", aquí está el ActionResult a medida que escribí para este tipo de situación:

public class PdfReportResult : ViewResult 
{ 
    /// <summary> 
    /// Crystal Report filename 
    /// </summary> 
    public string reportFileName { get; set; } 

    /// <summary> 
    /// DataSet used in the report 
    /// </summary> 
    public DataSet reportDataSet { get; set; } 

    /// <summary> 
    /// Report parameters 
    /// </summary> 
    IDictionary<string, object> parameters { get; set; } 

    public PdfReportResult(string reportFileName, DataSet reportDataSet, IDictionary<string, object> parameters) 
    { 
    if (string.IsNullOrEmpty(reportFileName)) 
     throw new ArgumentException("Report filename not informed", "reportFileName"); 

    if (reportDataSet == null) 
     throw new ArgumentException("DataSet not informed", "reportDataSet"); 

    if (parameters == null) 
     this.parameters = new Dictionary<string, object>(); 
    else 
     this.parameters = parameters; 

    this.reportDataSet = reportDataSet; 
    this.reportFileName = reportFileName; 
    } 

    public PdfReportResult(string reportFileName, DataSet reportDataSet) 
    : this(reportFileName, reportDataSet, null) 
    { } 

    public override void ExecuteResult(ControllerContext context) 
    { 
    if (context == null) 
     throw new ArgumentNullException("context"); 

    if (string.IsNullOrEmpty(this.ViewName)) 
     this.ViewName = context.RouteData.GetRequiredString("action"); 

    // Alias to make the code more legible 
    HttpResponseBase response = context.HttpContext.Response; 

    // Generating the report 
    using (ReportDocument report = new ReportDocument()) 
    { 
     // Load the report 
     report.Load(context.HttpContext.Server.MapPath("~/Reports/" + reportFileName)); 

     // Set the dataset 
     report.SetDataSource(reportDataSet); 

     // Set the parameters (if any) 
     foreach (var parameter in parameters) 
     report.SetParameterValue(parameter.Key, parameter.Value); 

     // Send back the PDF to the user 
     using (MemoryStream oStream = (MemoryStream)report.ExportToStream(ExportFormatType.PortableDocFormat)) 
     { 
     response.Clear(); 
     response.Buffer = true; 
     response.AddHeader("Content-Disposition", this.ViewName + ".pdf"); 
     response.ContentType = "application/pdf"; 
     response.BinaryWrite(oStream.ToArray()); 
     response.End(); 
     } 
    } 
    } 
} 
2

Desde el informe de cristal es un control de servidor, necesitamos una página web/usercontrol para mostrar el informe. Y nunca coloque este formulario web/control de usuario dentro de la carpeta de vistas en mvc, obtendrá los botones rotos con 404 en CrViewer. También puede usar un Iframe en una vista de maquinilla para visualizar el informe. A continuación se muestra un modelo de trabajo [VS2010], por favor revise.

Paso 1: Configuración de Crystal Report
1. Crear carpeta de nivel superior en el directorio raíz del sitio web.
2. Ponga su archivo Crystal report.rpt en esta carpeta
3. Agregue una página web (.aspx) a esta carpeta. Esta página sirve como página de visor de informes. Agregue un control CrystalReportViewer en esta página.se añadirá

div align="center" style="width:100%; height:100%;" 
     CR:CrystalReportViewer ID="crViewer" runat="server" AutoDataBind="true" 
div 

4. Tras el registro de montaje en la parte superior de la página aspx.

<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>. 
  1. comprobar la versión de CrystalReportViewer. Para esto, seleccione "elegir elementos" de Toolbox en VS Sidebar. Compare esta versión con CrystalDecisions. Versión web en la parte superior de la página aspx. Si ambos son iguales, déjelos; de lo contrario, cambie la versión de registro del ensamblaje de CRViewer.

  2. Vaya al archivo web.config debajo de la carpeta raíz del sitio web; compruebe los ensamblajes que comienzan con 'CrystalDecisions' debajo de la etiqueta. Cambie sus versiones igual que en la versión CrystalReportViewer (aquí Version = 13.0.2000.0).

Paso 2: Configuración del controlador, Acción & Ver
1. Añadir una nueva acción en la clase controlador informe.
2. Escriba los pasos necesarios para cargar datos desde la base de datos/archivos.
3. Establezca los datos en Session.
4. No agregue vista para esta acción. En su lugar, use el método Response.Redirect.

public class ReportController : Controller 
    { 
    public ActionResult reportView(string id) 
    { 
    Session["ReportSource"] = GetdataFromDb(); 
    Response.Redirect("~/Reports/WebForm1.aspx"); 
    return View(); 
    } 
    } 
  1. Añadir evento de carga de la página a la página .aspx.

    protected void Page_Load(object sender, EventArgs e) 
    { 
    CrystalDecisions.CrystalReports.Engine.ReportDocument report = 
    new CrystalDecisions.CrystalReports.Engine.ReportDocument(); 
    report.Load(Server.MapPath("~/Reports/CR_report.rpt")); 
    report.SetDataSource(Session["ReportSource"]); 
    crViewer.ReportSource =report; 
    } 
    

Paso 3: pequeño programa en Global.asax
1. Para evitar “estado de sesión ha creado un identificador de sesión, pero no se puede salvar porque la respuesta ya se inundó por el aplicación. " error o " salida de página de informe de cristal en blanco " agregue el siguiente código en Global.asax.

void Session_Start(object sender, EventArgs e) 
    { 
    string sessionId = Session.SessionID; 
    } 

Ahora puede llamar a la acción reportView() en ReportController para visualizar el informe cristalino.
¡Que tengas un buen día!

Cuestiones relacionadas