2016-08-23 7 views
0

ユーザーがボタンをクリックすると、クエリがxlsxをダウンロードできるようになったページが開設されました。 クエリの実行に2〜3秒かかる場合があります。レスポンスウィンドウのダウンロード前にasp.net appのjavascriptコードで実行

<asp:ImageButton id="Bt" OnClientClick=" this.style.display = 'none'; /> 

とサーバサイドスクリプトが終了します:

は、私はそれがボタンのJSを経由して、通常は簡単な操作であることを知っている

Bt.Style.Add("display", "inline"); 

しかしxslxを作るために私このコードを使用してください:

response = System.Web.HttpContext.Current.Response; 
response.ClearContent(); 
response.Clear(); 
response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
response.AddHeader("Content-Disposition", "attachment; filename=name.xlsx"); 
response.TransmitFile(file_path); 
response.Flush(); 
response.End(); 

レスポンスコンテキストをクリアすると、他のjavascriptコードをscr ipt(これはうまくいきません)ので、ボタンの表示をインラインに設定する方法がわかりません。

+1

あなたは、クライアントに全く異なる応答を提供している、つまりページを更新せずにファイルを送信するため、サーバー側では機能しません。しかし、同様にクライアント側には、ダウンロードが完了した時点を検出する方法がありません(本質的に同じ理由で、実際のページコンテキスト外では全く別の要求です)。たくさんの人がこれを解決しようとしています:https://www.google.co.uk/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=js%20detect%20end%20of%20file%20downloadあなたが見ることができるように、信頼できるか簡単な解決策はありません。 – ADyson

答えて

0

コメント内のADysonの提案は正しいです。この問題を解決する居心地の良い解決策はありません。 ところで、私はこれを解決するためのトリックをした、それは不自由なのですが、それは簡単ですし、それは動作します。とにかく誰かに投稿すると便利です。

try 
{ 
    ... 
} 
catch 
{ 
    ... 
} 
finally 
{ 
    script = "document.getElementById('Bt').style.display = 'inline';"; 
    if(add_click) 
    script += "document.getElementById('Bt_Download_Hidden').click();"; 

Page.ClientScript.RegisterStartupScript(typeof(System.Web.UI.Page), "alert", @" 
    <script type=""text/javascript""> 
     " + script + @" 
    </script>"); 
     } 

すべての作業を行う前のボタンで、私はxlsxを準備し、結果変数をセッション変数に格納しました。 finally節で見てきたように、ボタンの表示を常にインラインに戻すスクリプトを実行し、最後にはすべてがうまくいけば隠しボタンをクリックします。この2番目のボタンでは、コードをダウンロードしてファイルをダウンロードします。 私は最後にフラッシング操作を強制します。

関連する問題