2

サーバーからクライアントにファイルをダウンロードする次のコードがあります。これは、ボタンbtnSavetoDB_ExportToExcelがクリックされたときに発生します。その後、ボタンを無効にしたいのですが、どうすればそれを達成できますか?

string fileName = newFN + ".xlsx";
                Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
                Response.TransmitFile(DestFile);                    
                Response.End();
btnSavetoDB_ExportToExcel.Enabled = false;

上記のコード(応答)を配置してもボタンが無効にならないことに気付きました。別のコードがあり、それでボタンが無効になったためです。したがって、それは応答に関連するものでなければなりません。

編集:

ボタンはModalPopupExtender重要な場合に備えてにあります。

4

4 に答える 4

1

これは、サーバー コードでボタンを無効にした場合、ブラウザー ウィンドウに応答を返す必要があるためです。

ここでは、ブラウザによってキャプチャされたストリームを、ブラウザ ウィンドウではなくファイルとして返すため、現在の表示が更新されることはありません。

これを回避するには、html 自体のボタンに JavaScript の行を実装します。

Page_Load、f.ex のコードで Attribute.Add() を使用できます。

btnSavetoDB_ExportToExcel.Attribute.Add("onclick","this.disabled=true")
于 2012-11-12T20:45:53.720 に答える
1

少なくとも 2 つの可能な解決策があります。
1)応答にファイルを書き込む代わりに、サーバーの一時ディレクトリにファイルを生成し、ユーザーにこのファイルへのリンクを提供する(またはこのリンクにリダイレクトする)ことができます。

Page_Load2) 応答への書き込みを使用する場合は、そのメソッドでファイルを応答に書き込む新しい Generate.aspx ページを作成できます。

if (Request.QueryString["ID"] != null)  
{
    //find file by its ID
    ...
    Response.AddHeader("Content-disposition", "attachment; filename=" + fileName));
    Response.ContentType = "application/octet-stream";
    Response.WriteFile(fullFileName);
    Response.End();
}

btnSavetoDB_ExportToExcel のページに次のPage_Loadコードを追加します。

var script = @"<script language=JavaScript>function Export(fileID)
{
        var iframe = document.createElement('iframe');
        iframe.src = 'Generate.aspx?ID='+ fileID;
        iframe.style.display = 'none';
        document.body.appendChild(iframe);
}
</script>";

Page.RegisterStartupScript("Startup", script);

そして、javascriptExportメソッドを呼び出してファイルをユーザーに送信します。

于 2012-11-12T21:21:06.807 に答える
0

私は自分の問題の解決策を見つけました。クレジットは次のとおりです。DaveWard (ここをクリック)

<asp:Button ID="btnSavetoDB_ExportToExcel" runat="server" 
                    OnClientClick="this.disabled = true;"
                    UseSubmitBehavior="false"
                    Text="Save results to DB and export to Excel"   
                    onclick="btnSavetoDB_ExportToExcel_Click" />

これはトリックを行います: OnClientClick="this.disabled = true;" UseSubmitBehavior="false"

于 2012-11-13T13:50:12.207 に答える
0

他の回答で述べたように、ボタンはクライアント側で無効にする必要があります (Response.End()コードで使用しているため、ASP.NET はボタンにEnabled=False.

.aspx ファイルに追加します

<asp:Button ID="btnSavetoDB_ExportToExcel" OnClientClick="this.disabled=true;" [..] />

ただし、これはまったく良い考えではない可能性があることにも注意してください。ユーザーがファイルのダウンロード ウィンドウで誤って [キャンセル] をクリックした場合はどうなるでしょうか。

より良い解決策 (ユーザーがボタンを複数回クリックするのを防ぎたいことを理解した上で) は、タイマーを追加してボタンを再度有効にすることです。

<asp:Button ID="btnSavetoDB_ExportToExcel" OnClientClick="var a=this; a.disabled=true; window.setTimeout(function() { a.disabled=false; }, 5000)" [..] />

5000は、ボタンが再度有効になるまでのミリ秒単位の時間です。

于 2012-11-12T21:01:17.227 に答える