ASP.NET MVC2中的Crystal Report视图

时间:2012-07-03 13:44:55

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

我正在使用经典ASP.NET MVC 2连接的ASP.NET WebForm项目来显示Crystal Report Viewer。

这一切都很好。  问题是,在CrystalReportViewer实例上设置参数并对其进行渲染后,显示的报告始终指示缺少参数值。

还有其他人遇到过这个吗?

1 个答案:

答案 0 :(得分:0)

我不知道它是否会对您有所帮助,但我建议您在视图上使用服务器控件返回一个文件。您可以使用水晶报告导出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