2

最近、Excel スプレッドシートに大量のデータをダウンロードするときに、進行状況インジケーターまたはビジー インジケーターをユーザーに提供する方法を検討していました。~ 3000 行の場合、これには約 9 ~ 10 秒かかるため、ユーザーを楽しませるための何かが必要です。

私は blockUI の使用を検討しましたが、これは最初は素晴らしいことでしたが、問題は、ファイルの確認を受け取った後に UI のブロックを解除する方法でした。私は良い記事を読みました:

http://geekswithblogs.net/GruffCode/archive/2010/10/28/detecting-the-file-download-dialog-in-the-browser.aspx

そのため、jquery cookie と blockUI を使用することになりました。何らかの理由で Firefox では表示されませんが、IE8 では表示されます (!!!!)。まったく別の問題。

表面的には、その記事のコードは機能します。テストアプリを作成しましたが、すべて問題ありませんでしたが、これを作成中のアプリケーションに適用すると、Cookie の削除に失敗しました。バーに完全なURLがあると気に入らないことがわかりました:

http://localhost:4790/Home.aspx/Index ^^ Global.asax.cs は、このアプリケーションが IIS6 にデプロイされるという事実のために変更されました。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}.aspx/{action}/{id}",
            //"{controller}/{action}/{id}", // URL with parameters
            new { action = "Index", id = "" } // trying for IIS6
            //new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

        // New - trying for IIS6
        routes.MapRoute(
            "Root",
            "",
            new { controller = "Home", action = "Index", id = "" }
            );
    }
    /*

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }     // Parameter defaults
        );

    }
     * */

コントローラーでは、私が持っているインデックスアクションのために:

    public ActionResult Index()
    {
        return View();
    }

ホームコントローラーにも、ファイルを送り返す「偽装」するメソッドがあります。また、Cookie「fileDownloadToken」を「export」の値に設定します。

    public ActionResult GetFile()
    {
        Thread.Sleep(5000);
        byte[] test = new byte[1000];
        this.Response.AppendCookie(new HttpCookie("fileDownloadToken", "export"));
        return File(test, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "test.xlsx");
    }

インデックス ビューの内容は次のとおりです。

@{
    ViewBag.Title = "Home Page";
}

<input id="save_button" type="button" value="Get" onclick='window.location.href=("@Url.Action("GetFile")")' />

<script type="text/javascript">

$(document).ready(function () {
    $('#save_button').click( function () {
        $.blockUI({
            message: $('#loading')
        });
        blockUIForDownload();
    });       

});

var fileDownloadCheckTimer;
function blockUIForDownload() {
    fileDownloadCheckTimer = window.setInterval(function() {
        var cookieValue = $.cookie('fileDownloadToken');
        if (cookieValue == "export")
            finishDownload();
        }, 100);
}

function finishDownload() {
        window.clearInterval(fileDownloadCheckTimer);
        $.cookie('fileDownloadToken', null);
        $.unblockUI();
    }

</script>

<div id="loading" style="display: none;">
    <br />
    <img src="@Url.Content("~/Content/Images/loading.gif")" /><br />
    <h2>Exporting, Please Wait...</h2>
</div>

さて、上で述べたように、VS2010 で指定されているように localhost: を直接参照すると機能しますが、localhost:/Home.aspx/Index を参照すると失敗します。

IE8 で開発者ツールを使用してデバッグし、アラートなどを使用して Cookie の値を警告しましたが、$.cookie("XXXX", null) を呼び出した後でも Cookie の値は残ります。それが何らかのパス/ドメインの問題であった場合、Cookieの値をまったく取得できないため、ボタンを押した直後にUIのブロックが解除されるという点では逆ですが、

4

0 に答える 0