这是我的问题(好吧它根本不是问题),有可能有一个继承自ui.page的类,然后实例化该类的对象并重定向到它吗?
这样的事情:
Public sub myMethod()
Dim myPage as new myClassThatInheritsFromUIPage()
Response.redirect(myPage) 'Here is one of my "no-idea" line
end sub
我在我的webForm中执行此操作(以及我想在继承自ui.page的类中执行的操作):
Response.BufferOutput = True
Response.ClearContent()
Response.ClearHeaders()
ostream=crReportDocument.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat)
Response.AppendHeader("Cache-Control", "force-download")
Response.AppendHeader("Content-disposition","attachment;filename=ReportAsPDF.pdf")
Response.ContentType = "application/pdf"
Response.BinaryWrite(ostream.ToArray())
Response.Flush()
HttpContext.Current.ApplicationInstance.CompleteRequest()
我想要做的事情完全可以使用普通的WebForm,但我的webForm根本没有呈现任何内容(至少为(x)html所以,那是因为我想知道我问的是什么可能实现。
谢谢大家。
最后我只是将“HttpContext.Current。”添加到包含“response”属性的所有行,所以现在我只有一个不继承自“UI.Page”的类“只需调用清除缓冲区的方法(自定义方法),添加标题(强制下载,设置mime类型和文件名)并自行刷新响应并获得我想要的效果/用途。
要访问Session vars,只需添加“HttpContext.Current”。并且它有效,我不知道它是多么安全或者是否是一种好方法,但似乎运作良好。
所以代码现在看起来像这样:
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports CrystalDecisions.ReportSource
Namespace foo
Public Class requestReport
'just to instance the object'
Public Sub New()
End Sub
Public Sub downloadReport()
'do all the stuff to connect and load the report'
HttpContext.Current.Response.BufferOutput = True
HttpContext.Current.Response.ClearContent()
HttpContext.Current.Response.ClearHeaders()
ostream=crReportDocument.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat)
HttpContext.Current.Response.AppendHeader("Cache-Control", "force-download")
HttpContext.Current.Response.AppendHeader("Content-disposition","attachment;filename=ReportAsPDF.pdf")
HttpContext.Current.Response.ContentType = "application/pdf"
HttpContext.Current.Response.BinaryWrite(ostream.ToArray())
HttpContext.Current.Response.Flush()
HttpContext.Current.ApplicationInstance.CompleteRequest()
End Sub
End Class
End Namespace
例如,从命令执行此操作:
dim myReport as new foo.requestReport()
myReport.downloadReport()
当然,现在您可以根据需要添加更多属性或方法。
所以现在我甚至不不使用Response.redirect()或继承自“UI.Page”,只是一个“改变”“当前响应”和“刷新”的类“用水晶报告在飞行中创建的内容,我想我完全失去了,但你的答案真的对我很有帮助,尤其是 Tejs 说的,几乎与我刚刚做的相同或相同。谢谢。
更新 顺便说一下,我只是意识到ReportDocument类有这样的方法: ExportToHttpResponse 让我们将Crystal Report刷新为浏览器,如PDF / XSL等强制(或不强制)下载文件。 / p>
答案 0 :(得分:2)
不,因为没有接受UI.Page实例的当前重载。但是,您可以在新页面上调用Render
方法并直接写入响应流。 AKA
Response.End()
刷新请求并将其发送给客户端。 如果您的新页面实际上没有做任何事情,那么您可以通过响应发回更多内容。
答案 1 :(得分:2)
您可以使用Server.Transfer并传入要转移到的页面对象的实例。
答案 2 :(得分:1)
尝试这样做:
HttpContext.Current.Response.Redirect("...");
答案 3 :(得分:1)
HttpRequest Request = HttpContext.Current.Request;
HttpResponse Response = HttpContext.Current.Response;
之后,您可以重定向任何页面。