将RadFlowDocument作为PDF发送给用户

时间:2016-01-25 19:14:50

标签: asp.net-mvc vb.net telerik

我在MVC应用程序中使用VS 2013,VB.Net和Telerik 2016 Q1。我使用Telerik RadFlowDocument创建报告,并将其作为pdf发送给用户。我已成功创建报告并将其保存在本地。我的问题是,当我尝试将其转换为内存流并将其发送回用户时,用户永远不会选择下载报告。

我有一个按钮,通过ajax启动该过程:

function supervisorPDF() {
    $.ajax({
        url: '@Url.Action("GenerateSupervisorReportPDF", "InteriorReport")',
        type: 'POST'
    })
    .success(function (result) {

    })
    .error(function (xhr, status) {
        alert(status);
    })
}

我有一个接收ajax调用的子例程,然后生成报告:

    Sub GenerateSupervisorReportPDF()
        Dim generator As New PdfGenerator
        Dim selectedSupervisorName = System.Web.HttpContext.Current.Session("selectedSupervisorName").ToString()
        Dim selectedSupervisorIdNumber = System.Web.HttpContext.Current.Session("selectedSupervisorIdNumber").ToString()
        Dim report As New RadFlowDocument

        Dim viewModel As New SupervisorReportViewModel
        Dim model = viewModel.getSupervisorReportInfo(selectedSupervisorName, selectedSupervisorIdNumber)

        report = generator.generateSupervisorPdf(model)

        Dim provider As New PdfFormatProvider()
        Dim output As New MemoryStream
        provider.Export(report, output)

        Dim buffer As Byte()

        Try
            buffer = output.ToArray
            Response.ClearContent()
            Response.ClearHeaders()
            Response.ContentType = "application/pdf"
            Response.OutputStream.Write(buffer, 0, buffer.Length)
            Response.AddHeader("Content-Disposition", "attachment;filename=SupervisorReport.pdf")
            Response.End()
        Catch ex As Exception

        End Try

    End Sub

在这个子例程中,如果我将output声明为本地文件路径,则一切都按预期工作。但是,在使用此实现时,Response.OutputStream始终为空。没有错误被抛出。

我需要更改什么才能将此报告发送给用户,以便他们可以选择下载报告?

1 个答案:

答案 0 :(得分:1)

您将无法通过ajax执行此操作。

为了让浏览器接收和处理

assertTrue ((numDevicesWithActiveMessage+1) == deviceEventService.findWithActiveMessage().size());

DeviceEvent deviceEvent3 = newDeviceEvent();
deviceEvent3.setMessage(1);
deviceEventService.save(deviceEvent3);

DeviceEvent deviceEvent4 = newDeviceEvent();
deviceEventService.save(deviceEvent4);

assertTrue ((numDevicesWithActiveMessage+1) == deviceEventService.findWithActiveMessage().size());

必须直接浏览。

ajax调用可能会将二进制文件下载到jquery,但jquery将无法在本地保存它。

最简单的选择是让浏览器打开指向直接生成PDF的操作的链接,例如:

Content-Disposition:attachment

作为额外的,您可以将所有<a href='@Url.Action("GenerateSupervisorReportPDF", "InteriorReport")'>download report</a> 代码缩减为简单Response.,它应该处理提示用户保存等等 - 我会留给您(因为我不喜欢) t具有确切的语法(