0

私の ASP ページでは、ASP ページでファイルをダウンロードする直前に 1 つの JavaScript 関数を呼び出す必要があります。私の実際の要件は、ダウンロードボタンをクリックするたびにダウンロード形式を確認する必要があることです。

したがって、私のダウンロード ボタン イベントでは、2 つのラジオ ボタン (asp:RadioButton)、つまり docx、pdf と 1 つの [OK] ボタンを含む div タグを表示するだけです。ラジオ ボタンを選択した後、ユーザーは [ok] ボタン (asp:Button) を押します。 .

ついに、

Ok ボタン (asp:Button) イベントでは、div タグ部分を非表示にするだけで、ユーザーが選択した出力形式に基づいて、ファイルがダウンロードされます。

私のOKボタンイベントコードは以下のとおりです。

   protected void OKButton(object sender, EventArgs e)
    {
        string outputType = "";
        if (docx.Checked == true)
        {
            outputType = "docx";
        }
        else
        {
            outputType = "pdf";
        }

        filename=filename+"."+outputType;
       ClientScript.RegisterStartupScript(GetType(), "popup", "hidePopUp()", true);
       bool isDownloaded=downloadFile(strURL, docPath, filename);
    }

downloadFile 関数を以下に示します。

protected bool downloadFile(string srcURL, string docPath, string filenameOnly)
        {
            System.IO.FileInfo FileName = new System.IO.FileInfo(srcURL);
            FileStream myFile = new FileStream(srcURL, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            BinaryReader _BinaryReader = new BinaryReader(myFile);

            if (FileName.Exists)
            {
                try
                {
                    long startBytes = 0;
                    string lastUpdateTiemStamp = File.GetLastWriteTimeUtc(docPath).ToString("r");
                    string _EncodedData = HttpUtility.UrlEncode(filenameOnly, Encoding.UTF8) + lastUpdateTiemStamp;

                    Response.Clear();
                    Response.Buffer = false;
                    Response.AddHeader("Accept-Ranges", "bytes");
                    Response.AppendHeader("ETag", "\"" + _EncodedData + "\"");
                    Response.AppendHeader("Last-Modified", lastUpdateTiemStamp);
                    Response.ContentType = "application/octet-stream";
                    Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName.Name);
                    Response.AddHeader("Content-Length", (FileName.Length - startBytes).ToString());
                    Response.AddHeader("Connection", "Keep-Alive");
                    Response.ContentEncoding = Encoding.UTF8;

                    //Send data
                    _BinaryReader.BaseStream.Seek(startBytes, SeekOrigin.Begin);

                    //Dividing the data in 1024 bytes package
                    int maxCount = (int)Math.Ceiling((FileName.Length - startBytes + 0.0) / 1024);

                    //Download in block of 1024 bytes
                    int i;
                    for (i = 0; i < maxCount && Response.IsClientConnected; i++)
                    {
                        Response.BinaryWrite(_BinaryReader.ReadBytes(1024));
                        Response.Flush();
                    }
                    //if blocks transfered not equals total number of blocks
                    if (i < maxCount)
                        return false;
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
                finally
                {
                   _BinaryReader.Close();
                    myFile.Close();
                }
            }
            else
            {
                return false;
            }

        }//downloadFile ends here...

ここで、特定のファイルが正常にダウンロードされました。ただし、Div タグ部分は非表示になりませんでした。

downloadFile 関数を呼び出さずに試してみたところ、div タグ部分が正常に非表示になります。

ただし、最初にdivタグ部分を非表示にしてから、特定のファイルをダウンロードする必要があります.私の画像も参照してください...

ここに画像の説明を入力

この問題から抜け出すために私を導いてください...

4

3 に答える 3

1

ここで何が起こっているか考えてみてください。

  • [OK]ボタンをクリックすると、サーバーへのポストバックを引き起こすJavaScriptが実行されています。
  • OKButtonハンドラーで、スタートアップスクリプトを登録します。このスクリプトはこの時点では実行されません。応答ストリームがクライアントに戻ると実行されます。
  • OKハンドラーからファイルのダウンロードメソッドを実行します。
  • ダウンロード方法では、応答をクリアしてから、添付ファイルタイプの応答を実行します。

したがって、RegisterStartupScriptは実行されていません。クライアントとサーバーのロジックを可能な限り分離します。

Blachshmaの方法として、OnClientClickを使用してこれを実現できます。

于 2012-11-22T13:18:33.903 に答える
1

コードを変更してみてください:

  ClientScript.RegisterStartupScript(GetType(), "popup", "Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(hidePopUp)", true);
于 2012-11-22T13:18:59.817 に答える
1

OKButton の ClientClick で Div を非表示にしないでください。

例えば:

<asp:Button ID="OkButton" runat="server" .... OnClick="OkButton_Click"
        OnClientClick="document.getElementById('divName').style.display = 'none';" />
于 2012-11-22T13:06:30.883 に答える