Ответ.Перенаправление в класс, который наследует от пользовательского интерфейса.Страницы?


Все, спасибо за ваше время.

Ну это моя проблема (ну это вообще не проблема), можно иметь класс, который наследует от ui.страница, а затем экземпляр объекта этого класса и сделать перенаправление на него ?

Что-то вроде этого:

Public sub myMethod() 
    Dim myPage as new myClassThatInheritsFromUIPage()
    Response.redirect(myPage) 'Here is one of my "no-idea" line
end sub

Я делаю это в моей веб-форме (и это то, что я хочу сделать в классе, который наследует от ui.Страница):

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()

То, что я хочу сделать, вполне возможно с обычной веб-формой, но моя веб-форма ничего не рендерит. все (по крайней мере, как (x)html так, это потому, что я хотел бы знать, возможно ли достичь того, о чем я прошу.

Спасибо всем.

Ну в конце я просто добавляю " HttpContext.Текущий." для всех строк, которые содержат атрибут "response", поэтому теперь у меня есть только класс, который не наследует от " UI.Страница " и просто вызовите метод, который очищает буфер (пользовательский Метод), Добавьте заголовки (чтобы принудительно загрузить, Установите тип mime и имя файла) и очистите ответ сам по себе и получить эффект / использовать я хочу его.

Для доступа к сессии vars просто добавьте " HttpContext.Текущий."и это работает, я не знаю, насколько безопасно или если это хороший способ, но, кажется, работает хорошо.

Итак, код теперь выглядит примерно так:

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() 

Конечно, теперь вы можете добавить дополнительные атрибуты или метод, если вам это нужно.

Так что теперь я даже Не использую ответ.redirect () или наследует от " UI.Страница", просто класс, который "изменяет ""текущий ответ" и "сливает" контент, созданный на fly с отчетом crystal, я думаю, что я был отчасти полностью потерян, но ваши ответы действительно помогают мне, особенно то, что говорит Tejs, что почти то же самое или то же самое, что я только что сделал. Спасибо.

Обновление: Кстати, я только что понял, что класс ReportDocument имеет такой метод: ExportToHttpResponse, который позволяет нам сливать отчет Crystal в браузер в формате PDF/XSL и т. д .. (или нет) загрузка файла.

4 2

4 ответа:

Попробуйте просто сделать это вместо этого:

HttpContext.Current.Response.Redirect("...");

Нет, так как нет текущей перегрузки, которая принимает пользовательский интерфейс.Экземпляр страницы. Однако можно вызвать метод Render на новой странице и записать его непосредственно в поток ответов. АКА

  1. Очистите буфер ответов.
  2. отрисовка экземпляра страницы в буфер ответов.
  3. вызовите Response.End(), чтобы очистить запрос и отправить его клиенту.

Если ваша новая страница на самом деле ничего не делает, вы можете дополнительно просто не отправлять контент обратно с ответом.

Вы можете использовать сервер.Передача и передача в экземпляре объекта страницы,который вы хотите передать.

Вот документация: HttpServerUtility.Передача

 HttpRequest Request = HttpContext.Current.Request;
 HttpResponse Response = HttpContext.Current.Response; 

И после этого вы можете перенаправить любую страницу.