Asp.net mvc ASP.NET MVC2中的Crystal报表视图

Asp.net mvc ASP.NET MVC2中的Crystal报表视图,asp.net-mvc,asp.net-mvc-2,crystal-reports,report,webforms,Asp.net Mvc,Asp.net Mvc 2,Crystal Reports,Report,Webforms,我正在处理一个ASP.NET mvc2项目,使用一个经典的ASP.NET网络表单连接显示Crystal Report Viewer 这一切都很好。 问题是,我在CrystalReportViewer实例上设置参数并渲染后,显示的报告始终指示缺少参数值 还有其他人遇到过这种情况吗 我不知道这是否对您有帮助,但我建议您返回使用视图上的服务器控件安装的文件。您可以使用crystal reports导出PDF或DOC文件并将其响应到客户端。您可以尝试将此自定义操作结果用于crystal报告: publi

我正在处理一个
ASP.NET mvc2
项目,使用一个经典的
ASP.NET网络表单
连接显示Crystal Report Viewer

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


还有其他人遇到过这种情况吗

我不知道这是否对您有帮助,但我建议您返回使用视图上的服务器控件安装的文件。您可以使用crystal reports导出PDF或DOC文件并将其响应到客户端。您可以尝试将此自定义操作结果用于crystal报告:

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
}

备注:代码在pt br

Nice中,如果它能帮助您解决问题,请作为awser检查。也许它也能帮助其他人:)