2009-04-22 7 views
2

저장 대화 상자는 로컬 컴퓨터에 파일을 저장합니다. 그러나 그 후, 내 페이지가 거기 서서 나머지 과정을 위해 아무 것도하지 않습니다. 내가 저장 대화 상자를 열려면 코드 아래 사용페이지 새로 고침 ASP.NET에서

protected void lnkbtnDownload_Click(object sender, EventArgs e) 
{ 
    string fileName = startupPath + "bin\\Inbox.mdb"; 
    System.IO.FileInfo targetFile = new System.IO.FileInfo(fileName); 

    if (targetFile.Exists) 
    { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + targetFile.Name); 
     Response.AddHeader("Content-Length", targetFile.Length.ToString()); 
     Response.ContentType = "application/octet-stream"; 
     Response.WriteFile(targetFile.FullName);       
     Response.End(); 
    } 
} 

HTML 코드는 다음과 같습니다

<asp:Button id="lnkbtnDownload" runat="server" CausesValidation="false" 
    Text="Download" CssClass="buttonstyle" OnClick="lnkbtnDownload_Click"></asp:Button> 

하지만 파일 이후에 내 모든 페이지, 응답을 로컬 컴퓨터에 저장되지 않으며 대화가 가까운 저장입니다 . 저장 대화 상자가 닫힌 후에 페이지에 다시 게시하는 방법을 알고 싶습니다.

답변

9

Response.End를 호출하기 때문에 페이지의 응답이 중지됩니다.

+1

예 응답의 콘텐츠 유형이 "text/html"에서 "application/octet-stream "브라우저에서 렌더링 된 출력이 없을 것입니다. 또한 처리기를 사용하여 파일을 제공하는 것이 좋습니다 - 예를 들어 쿼리 문자열에 Guid를 전달하여 원하는 파일을 식별 할 수 있습니다. –

4

이 Response.WriteFile 작업을 수행하는 팝업 페이지/처리기를 열어야한다고 생각합니다.

+0

target = "_ blank"<- Visual Studio에서 squigglies를 줄 수도 있지만 LinkButton에 추가 할 수 있습니다. –

0

이 코드를 iframe 내부에서 실행하거나 파일 다운로드를 트리거하는 팝업을 열 수 있다고 말하고 싶습니다. 이 경우 응답을 덮어 쓰고로드 된 페이지가 손실됩니다.

그래서이 코드를 전용 페이지로 이동하고 위에서 언급 한 두 가지 솔루션 중 하나를 구현합니다.

0

두 개의 응답으로 단일 요청 (즉, 버튼 다시 게시)에 응답 할 수 없습니다.

그러나 다시 게시를 변경하여 별도의 다운로드/확인 페이지로 리디렉션 할 수 있습니다. 다운로드/확인 페이지는 iframe을 사용하여 다운로드를 시작합니다.

this question

5

는 HttpHandler를 내에서이 코드를 넣어 다음 핸들러가 필요로 어떤 정보를 전달, 원래의 페이지에서 해당 핸들러에 연결을 참조하십시오.

+0

어머, 많이 있습니다 이 문제를 해결할 수있는 간단한 HttpHandler 솔루션 인 것 같습니다. –

1

마크 Brackett의 answer 비슷한 질문에 당신이 페이지 간 포스트 백 URL 속성이 필요하지 않습니다를 제외하고, 여기에 작동합니다 :

<script type="text/javascript"> 
    var oldTarget, oldAction; 
    function newWindowClick(target) { 
     var form = document.forms[0]; 
     oldTarget = form.target; 
     oldAction = form.action; 
     form.target = target; 

     window.setTimeout(
     "document.forms[0].target=oldTarget;" 
     + "document.forms[0].action=oldAction;", 
     200 
    ); 
    } 
</script> 

<asp:LinkButton runat="server" id="lnkbtnDownload" 
    CausesValidation="false" Text="Download" CssClass="buttonstyle" 
    OnClick="lnkbtnDownload_Click" 
    OnClientClick="newWindowClick('download');" /> 

이 발생합니다 새 창에서 발생하는 포스트 백을하고 기존 응답 처리로 다운로드가 처리됩니다. 원래의 윈도우 폼은 이후의 상호 작용/포스트 백을 위해 복원됩니다.