2009-04-22 16 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 /オクテットストリーム "と呼ばれる出力がブラウザに表示されません。また、ファイルを処理するためにハンドラを使用することをお勧めします - 例えばクエリ文字列にGuidを渡して、目的のファイルを識別できるようにしてください。 –

4

このResponse.WriteFile操作を実行するポップアップページ/ハンドラを開くべきだと思います。

+0

target = "_ blank" < - これはあなたのLinkBut​​tonに追加することができます(ビジュアルスタジオからsquiggliesが返されます) –

0

このコードをiframe内で実行したり、ファイルのダウンロードを開始するためのポップアップを開くことができます。この場合、レスポンスを上書きしてしまい、ロードされると予想されたページが失われます。

私はこのコードを専用のページに移動し、上記の2つのソリューションのいずれかを実装します。

0

2件の返信で1回のリクエスト(ボタンのポストバック)に回答することはできません。

ただし、ポストバックを変更して別のダウンロード/確認ページにリダイレクトすると、iframeを使用してダウンロードが開始されます。

this question

5

はのHttpHandler以内にこのコードを入れて、あなたのハンドラが必要な情報を渡して、元のページからそのハンドラにリンクを参照してください。

+0

Gosh、単純なHttpHandlerソリューションは、これを解決するための簡単で適切な方法であると思われます。 –

1

マーク・ブラケット・の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');" /> 

これが原因となります新しいウィンドウで発生するポストバックを、そしてあなた既存のレスポンス処理によってダウンロードが処理されます。元のウィンドウ形式は、今後の対話/ポストバックのために復元されます。

関連する問題