2

この質問に続いて、以前に知りたいと思いました-コントローラーのアクションがファイルを返し、応答に書き込まれた後、Javascriptアラートも表示できますか?

このプロジェクトはMVC 1.0

これは、ファイルをダウンロードする直前に Javascipt を実行したい ActionReult です。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SomeImporter(HttpPostedFileBase attachment, FormCollection formCollection, string submitButton, string fileName)
{
    if (submitButton.Equals("Import"))
    {
        byte[] fileBytes = ImportClaimData(fileName, new CompanyExcelColumnData());
        if (fileBytes != null)
        {
            //This method stores the string in a message queue which is stored in the 
            //session and rendered from within a UserControl. The Javascript alert
            //is then shown subsequently.
            UserMessageUtil.Info("Data imported successfully.", Session);

            //The file downloads but no Javascript alert is shown from the line above.
            return File(
                fileBytes,
                "application/ms-excel",
                string.Format("Import {0}.xls", DateTime.Now.ToString("yyyyMMdd HHmm")));
        }
        return View();
    }
    throw new ArgumentException("Value not valid", "submitButton");
}

ユーザーコントロール内のキューを処理するための HTML ヘルパーメソッド:

public static string UserMessage(this HtmlHelper helper, HttpSessionStateBase session)
{
    MessageQueue queue = UserMessageUtil.GetMessageQueue(session);
    Message message = queue.Next;
    String script = null;

    if (message != null)
    {
        do
        {
            string messageStr = message.Text;
            ....
            script += @"alert('" + messageStr + "');";
        } 
        while ((message = queue.Next) != null);

        return script;
    }

    return null;
}

基本的に、ファイルはダウンロードされますが、Javascript アラートは表示されません。はUserMessageUtil.Info()プロジェクトの他の部分で使用され、期待どおりに機能し、実行時にアラートを表示します。

4

1 に答える 1

0

私の理解が正しければ、ファイルをダウンロードする準備ができたら、クライアント側の JavaScript を実行しますか?

同様のニーズがありましたが、Java EE の場合でも技術的な問題は変わりません。ここでこの素晴らしいハックを見てください http://geekswithblogs.net/GruffCode/archive/2010/10/28/detecting-the-file-download-dialog-in-the-browser.aspxこの回答で紹介されているようにブラウザがファイルのダウンロードを受け取る

基本的に、サーバーの応答で返されるアクションから Cookie を設定し、クライアント側でその Cookie の存在を JavaScript でポーリングする必要があります。サーバーが応答し、ファイル ダウンロード ダイアログがクライアントに表示されると、Cookie が検出され、スクリプトが実行されます。スクリプトが実行されると、Cookie を破棄できます。

于 2013-02-08T10:39:41.340 に答える