【问题标题】:Crystal Report view in ASP.NET MVC2ASP.NET MVC2 中的水晶报表视图
【发布时间】:2012-07-03 13:44:55
【问题描述】:

我正在处理一个ASP.NET MVC 2 项目,使用一个经典的ASP.NET WebForm 连接以显示水晶报表查看器。

这一切都很好。 问题是我在CrystalReportViewer 实例上设置参数并渲染它后,显示的报告总是显示参数值丢失。

有没有其他人遇到过这种情况?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 crystal-reports report webforms


    【解决方案1】:

    我不知道它是否会对您有所帮助,但我建议您使用视图上的服务器控件返回一个文件。您可以使用水晶报表导出 PDF 或 DOC 文件并将其响应给客户端。您可以尝试使用此自定义操作结果来生成报表:

    public class CrystalReportResult : FileResult
    {
        private const string CONTENTTYPE = "application/pdf";
        private const int BUFFERSIZE = 0x1000;
    
        private Stream FileStream { get; set; }
        private DataSet DataSource { get; set; }
        private string NomeArquivoRpt { get; set; }
        private string Diretorio { get; set; }
    
        public FormaAbrirPdf AbrirComo { get; set; }
    
        public CrystalReportResult( string nomeArquivoRpt, DataSet dataSource )
            : base( CONTENTTYPE )
        {
            DataSource = dataSource;
            NomeArquivoRpt = Path.Combine( AppDomain.CurrentDomain.BaseDirectory, nomeArquivoRpt );
            Diretorio = Path.Combine( AppDomain.CurrentDomain.BaseDirectory, "Temp" );
            AbrirComo = FormaAbrirPdf.ComoDownload;
    
            if ( !Directory.Exists( Diretorio ) )
            {
                Directory.CreateDirectory( Diretorio );
            }
        }
    
        public override void ExecuteResult( ControllerContext context )
        {
            var response = context.HttpContext.Response;
            var arquivoPdf = Path.Combine( Diretorio, String.Format( "{0}.pdf", Guid.NewGuid( ) ) );
            var relatorioCrystal = new ReportClass { FileName = NomeArquivoRpt };
    
            relatorioCrystal.Load( );
            relatorioCrystal.SetDataSource( DataSource );
    
            if ( AbrirComo == FormaAbrirPdf.ComoDownload )
            {
                relatorioCrystal.ExportToDisk( ExportFormatType.PortableDocFormat, arquivoPdf );
                FileStream = new FileStream( arquivoPdf, FileMode.Open, FileAccess.ReadWrite );
    
                var tamanho = (int) FileStream.Length;
                var ms = new MemoryStream( tamanho );
    
                FileStream.Read( ms.GetBuffer( ), 0, tamanho );
                ms.Close( );
    
                response.OutputStream.Write( ms.GetBuffer( ), 0, ms.GetBuffer( ).Length );
                response.OutputStream.Flush( );
                response.OutputStream.Close( );
    
                response.AddHeader( "content-disposition",
                                    String.Format( "attachment;filename={0}", arquivoPdf ) );
            }
            else
            {
                FileStream = relatorioCrystal.ExportToStream( ExportFormatType.PortableDocFormat );
                response.AddHeader( "content-type", CONTENTTYPE );
            }
    
            WriteFile( response );
            FileStream.Close( );
    
            if ( AbrirComo != FormaAbrirPdf.ComoDownload ) return;
    
            File.Delete( arquivoPdf );
        }
    
        protected override void WriteFile( HttpResponseBase response )
        {
            var outputStream = response.OutputStream;
            using ( FileStream )
            {
                var buffer = new byte[BUFFERSIZE];
    
                while ( true )
                {
                    var bytesRead = FileStream.Read( buffer, 0, BUFFERSIZE );
                    if ( bytesRead == 0 )
                    {
                        break;
                    }
                    outputStream.Write( buffer, 0, bytesRead );
                }
            }
        }
    }
    

    以及要下载的格式:

    public enum FormaAbrirPdf
    {
        NoNavegador, // open on the browser
        ComoDownload // with download
    }
    

    PS:代码在pt-br

    【讨论】:

    • 很好,如果它可以帮助您解决问题,请作为 awser 进行检查。也许它也可以帮助其他人:)
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多