2009-08-12 2 views
0
버튼 클릭 이벤트에 다음 코드를 가진 ASP.NET 2.0 페이지 감안할 때

...RegisterStartupScript()가 뒤로 버튼과 잘 어울리지 않습니다. 제안 사항이 있습니까?

Protected Sub btnQuickRpt_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles btnQuickRpt.Click 
    Dim uniqueReportId As String = GenerateQuickReport() 

    ' Opens the report on page reload. 
    ClientScript.RegisterStartupScript(Me.GetType(), "openReport", "window.open('Reports/" & uniqueReportId & ".pdf');", True) 
End Sub 

은 window.open() 코드 페이지가 다시로드 될 때 실행되는 코드와 관련된 버튼을 클릭 한 후 정확히. 그러나 그 후에 사용자가 다른 URL로 이동 한 다음 브라우저의 뒤로 버튼을 클릭하면 "window.open()"코드가 다시 발생하여 예기치 않게 사용자의 보고서 팝업이 얼굴에 나타나게됩니다.

유사한 스타일 스레드의 제안에 따라 페이지의 캐시 가능성을 설정하는 방법에 대해 놀랐지 만 프롬프트가없고 window.open() 코드를 실행하지 않아도이 페이지로 돌아올 것으로 예상되는 결과를 얻지 못했습니다. 다시.

이 상황을 처리하는 방법에 대한 제안이있는 사람이 있습니까?

답변

1

창이 열리기 전에 서버 단추를 사용하여 보고서를 생성하는 대신 단추의 클라이언트 스크립트를 사용하여 보고서를 만드는 페이지로 창을 열고 응답으로 반환하십시오.

보고서를 생성하고 응답 스트림에서 직접 반환하는 페이지 (예 : GenerateReport.aspx)를 만듭니다. 를 Page_Load 메서드에서 :

Dim uniqueReportId As String = GenerateQuickReport() 
Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.WriteFile(Server.MapPath("Reports/" & uniqueReportId & ".pdf")); 
Response.End(); 

이제 그냥 버튼에서 해당 페이지를 엽니 다

<input type="button" value="gimme teh repport!" onclick="window.open('GenerateReport.aspx','_blank');"/> 

당신은 대신에 일반 페이지의 HTTP 처리기를 사용할 수 있습니다, 그것은 당신이 무엇에 대한 좀 더 나은 적합 ,하지만 좀 더 친숙한 정규 페이지로 어떻게 할 수 있는지 보여주었습니다.

보고서를 파일 대신 메모리에 만들 수있는 경우 Response.BinaryWrite를 사용하여 보고서를 반환 할 수 있으므로 파일을 전혀 만들지 않아도됩니다.

+0

환상적인 답변이며 효과가 있음을 증명하기 위해 구현할 수있었습니다. 완전성을 위해서 창을 열기 전에 보고서를 생성하려고한다고 가정합니다. 나는 부모 페이지에 메시지/통지를 "생성"하고 있으며, 제안 된 해결책으로는 그 내용을 놓친다. 보고서를 생성하는 데 최대 20 초가 소요될 수 있으며 솔루션을 사용하면 빈 페이지가 표시되어 보고서가 표시되기를 기다릴 수 있습니다. 현재 행동과 더 많은 관계를 유지할 수있는 다른 제안이 있습니까? – ckittel

+0

동일한 창에서 PDF 페이지를 열 것을 요청하는 클라이언트 스크립트가있는 창에서 먼저 다른 페이지를여십시오 (body onload = "window.location.href = 'GenerateReport.aspx';"). 브라우저가 PDF가 생성되기를 기다리는 동안 첫 번째 페이지가 표시됩니다. – Guffa

+0

그래, 나는 너가 그 정확한 대답으로 돌아올 줄 알았는데, 그것은 완벽하게 합법적이다. 아마도 보고서가 생성되는 동안 사용자가 여전히 상위 페이지를보고 싶어하는 것이 분명해야합니다. 보고서가 준비 될 때까지 다른 페이지를 사용할 수 없게하려고합니다. 현재 상황에서 실제로 발생하는 현상은 보고서를 생성 한 후 현재 페이지 (FF, IE, Chrome)에서 * 팝업 *합니다. 상위 페이지에 초점을 두지 않습니다. 어쩌면 이것은이 행동을 유지하고 내가 원하는 방식으로 뒤로 버튼을 작동하게하는 모든 파이프 꿈일까요? – ckittel

관련 문제